面试题作答

[※]@property中有哪些属性关键字?
原子性:atomic/nonatomic
内存管理语义:retain、strong、copy、assign、weak
读写权限:readonly、readwrite
方法名:getter/setter

[※]weak属性需要在dealloc中置nil么?
不需要,因为weak是弱引用,不拥有新对象不释放旧对象,原对象释放之后,weak修饰的对象也被释放掉。

[※※]@synthesize和@dynamic分别有什么作用?
@synthesize是告诉系统如果没有手动设置setter/getter方法系统会帮助你设置setter/getter方法。
@dynamic告诉系统手动实现setter/getter方法。如果设置了这个属性,但是没有实现setter/getter方法,那么在编译的时候没问题,在执行的时候会崩溃,这也是OC的动态绑定的特性。

[※※※]ARC下,不显式指定任何属性关键字时,默认的关键字都有哪些?
我回答:automic
1、对象类型默认关键字:nonatomic,strong,readwrite,setter,getter
2、属性默认关键字:nonatomic,assign,readwrite,setter,getter

[※※※]用@property声明的NSString(或NSArray,NSDictionary)经常使用copy关键字,为什么?如果改用strong关键字,可能造成什么问题?
主要是为了保证声明的属性值的确定性。以NSString修饰的具体场景分析:
情景1:copy声明的属性A被赋值的对象也是不可变的B,那么A会做一个浅拷贝,也就是生成新的指针指向B,同时引用计数+1,如果使用strong修饰A,A引用计数加一,实际效果和copy也是一样的。
情景2:copy声明的属性A被赋值的对象也是可变的B,那么A会做一个深拷贝,克隆一个全新的B(有自己的内存和指针)。如果用strong来修饰,那么指针还是指向原来B的地址。
问题:如果在某个时刻B的内容发生了改变,用copy修饰的A数据不会改变。strong修饰的A会随着B的改变而改变,可能会带来莫名其妙的错误。具体用哪一个,看具体的场景了,但是我们一般为了保证数据的稳定性,使用copy修饰。
注意:copy修饰过的属性就成了一个不可变的,所以无法进行增删改操作。

[※※※]@synthesize合成实例变量的规则是什么?假如property名为foo,存在一个名为_foo的实例变量,那么还会自动合成新变量么?
先将旧的数据release,然后再赋值新的实例变量。
母鸡啊

[※※※※※]在有了自动合成属性实例变量之后,@synthesize还有哪些使用场景?
不知道

[※※]objc中向一个nil对象发送消息将会发生什么?
objc可以对一个nil的对象发送消息,不会崩溃。

[※※※]objc中向一个对象发送消息[obj foo]和objc_msgSend()函数之间有什么关系?
runtime会将其转化为,objc_msgsend(obj,@selector(foo))

[※※※]什么时候会报unrecognized selector的异常?
定义对象类型和创建对象类型不一致导致的。

[※※※※]一个objc对象如何进行内存布局?(考虑有父类的情况)
不知道,如何?

[※※※※]一个objc对象的isa的指针指向什么?有什么作用?
isa指针指向对象所在的类,找到对象所在的类,然后进行方法的实现。

作者:pingpong_龘
链接:https://www.jianshu.com/p/530939374c10
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

猜你喜欢

转载自blog.csdn.net/xiaoxiaocode/article/details/80583888