面试题总结

作者: Figo_OU | 来源:发表于2019-07-10 22:42 被阅读22次
  1. 变量age被定义为NSInteger,它编译时没有问题……但为什么会crash?
NSInteger age;
UILabel *mylabel=[UILabel new];
mylabel.text=age?[NSString stringWithFormat:@"%@",age]:@"";

NSInteger的默认值:
https://blog.csdn.net/yasi_xi/article/details/46784685

可以猜测,age所在的是常量存储区(.text区)。在常量存储区系统不保证初始化的数据为0.

那么我们知道了age肯定不为0了,因为如果为0 ,程序就不会crash了。
那么肯定就会执行到[NSString stringWithFormat:@"%@",age]中。而格式化字符串的时候其实就是调用的下面三个方法。

-initWithFormat:locale:
-initWithFormat:locale:arguments:
+localizedStringWithFormat:

这里就涉及到字符串本地化的问题了。因为%@,所以取出的对象将会调用descriptionWithLocale或者description方法。
“如果对象响应 -descriptionWithLocale: 方法,则调用它,否则调用 -description”

这里参考了ObjC中国的「玩转字符串 」文章https://objccn.io/issue-9-2/

那么重点来了,由于是%@,那么就会根据地址值去找这个对象。如果age是对象,那么假设age指针的值是0x10a2f1768。那么就会对0x10a2f1768所指向的对象发送description消息。所以如果是对象那么这里没有任何问题。

然而age是一个数字,那么这里会将这个数字转化为16进制的值,假设age的值为18。那么这里将向0x12这个地址所指向的对象发送description消息。因为这个0x12是指向不可用内存的指针,那么就会发生野指针错误。

野指针错误
野指针例子
NSObject *stu = [[NSObject alloc] init]; 
//    [stu setAge:10]; 这报的是方法找不到
    [stu release];  
    [stu setAge:10];//这报的是野指针错误。

相关文章

  • Java面试题汇总

    Java面试题总结 Java面试题总结一Java面试题总结二

  • iOS经典面试题总结--内存管理

    iOS经典面试题总结--内存管理 iOS经典面试题总结--内存管理

  • iOS RunLoop 总结以及相关面试题解答

    iOS RunLoop 总结以及相关面试题解答 iOS RunLoop 总结以及相关面试题解答

  • Paper Collection - InInterview

    ios 面试题 经典(比较全) 根据重点总结(总结的题还是比较多的,有答案) sunnyxx的面试题 很全的面试题目

  • JavaScript面试题整理(1)

    做面试题就是要做经典的面试题,通过这些具有代表性的面试题来学习与总结,从而掌握相同类型的题目。 对于面试题的总结与...

  • 2020年,精选大厂的iOS面试题总结(一)

    iOS面试题目录(一) 精选大厂的iOS面试题总结(一)精选大厂的iOS面试题总结(二) 1. iOS内存管理机制...

  • 面试题

    关注的面试题文集 Android面试题整理 Android工程师面试题大全 Android 面试题总结之Andro...

  • 面试题转载

    iOS面试了20几家总结出来的面试题iOS面试了20几家总结出来的面试题(二)

  • Handler面试题总结

    面试题总结 Handler是一个比较重要的东西,所以把网上发的Handler中的面试题总结了一下,这些面试题没问题...

  • java script 1

    1 史上最全的Javascript面试题总结 史上最全的Javascript面试题总结 1 未声明和未定义? 未声...

网友评论

    本文标题:面试题总结

    本文链接:https://www.haomeiwen.com/subject/pdfkkctx.html