1、@property中有哪些属性关键字?
答:@property中我们经常使用的关键字有strong,weak,assign,copy,nonatomic,atomic...等
strong:释放旧对象,将旧对象的值赋值给新对象,在提高输入对象的索引计数为1
weak:不增加引用计数,不持有对象,所以不能决定对象的释放,对比assign的一个好处是 当对象消失时 指针自动归为nil
assign ,copy, retain :说的通俗一些:
assign:不增加计数,一栋房子,俩人同进同出,一把钥匙
retain:计数加1,一栋房子,俩人相对独立,但是有两把钥匙
copy:重新开辟内存存放: 条件好了,俩人开始分居了,2栋房子,房子一人一套,一人一把钥匙。
weak,assign:
在MRC环境下使用assgin实现基本类型,在ARC环境下,weak相当于assign, weak 可以避免循环引用,同时,当对象不存在的时候,可以将其置为 nil.
2、weak 属性需要在dealloc中置为nil么?
答:不需要,在ARC环境下无论是强指针还是弱指针,都无需在dealloc中设置nil. ARC会帮我们处理。
3、@synthesize和@dynamic分别有什么作用?
答:@synthesize 让编译器自动生成getter和setter方法 ,用户无需手动实现
@dynamic 告诉编译器,不自动生成getter和setter方法,需用户手动实现
4、ARC下,不显式指定任何属性关键字时,默认的关键字都有哪些?
答:atomic,readwrite,assign,strong
5、用@property声明的NSString(或NSArray,NSDictionary)经常使用copy关键字,为什么?如果改用strong关键字,可能造成什么问题?
答:
我们都知道NSMutableArray是用strong来声明的,如果我们要也用strong来修饰NSArray;当把 NSArray=NSMutableArray 对象赋值的时候,NSArray就跟着NSMutableArray变化了,这样是很危险的,所以我们用copy来声明,单独开辟空间,保证自身的不可变性。
6、@synthesize合成实例变量的规则是什么?假如property名为foo,存在一个名为_foo的实例变量,那么还会自动合成新变量么?
答:规则是:如果指定了一个成员变量的名称,那么会自动生成一个指定名称的成员变量 如果这个成员已经存在了 就不会在生成了。如果property名为foo,存在一个名为_foo的实例变量 ,不会合成,不合成的情况下,实例变量的值与property是一起修改的。
7、在有了自动合成属性实例变量之后,@synthesize还有哪些使用场景?
答:指定类内部访问变量的方式
8、objc中向一个nil对象发送消息将会发生什么?
答:直接返回nil,因为发送消息底层是调用objc_msgSend(),如果对象为空,会直接返回nil.
9、objc中向一个对象发送消息[obj foo]和objc_msgSend()函数之间有什么关系?
答:发送消息底层由objc_msgSend()完成
10、什么时候会报unrecognized selector的异常?
答:头文件或者delegate中声明了某个方法却没有被实现,比如说:声明了tableView的协议,确没有实现必须的协议方法。
11、一个objc对象如何进行内存布局?(考虑有父类的情况)
答:先创建父类的,在创建子类的, objc中创建一个对象,内存中都将包含ISA指针和父类指针和调度表,这个ISA指针指向该类的实例方法和实例变量调度表,并且 该调度表里也有一个ISA指针,。该类相关调度表:如类方法,类名称,类版本,子类对象里的父类指针是指向父类内存地址的。
12、一个objc对象的isa的指针指向什么?有什么作用?
答:指向他的类对象,从而找到对象上的方法。