因为公司招人的原因,导致自己不得不去面试别人,自己做开发也快三年了,但是相关基础的概念、原理有点忘记了,记得也不是很系统
在这里总结下吧,免得面试别人翻车了哈哈
1、属性修饰词
一、readOnly,readWrite
答:readonly根据字面意思,只读属性,只生成了getter方法,如果调用setter方法程序会Cash。但是事实是这样嘛?只读属性真的不能赋值吗,其实可以通过KVC去修改其键值。readWrite,默认可读可写,没啥说的。
PS:self.和_的区别,self.就是调用property自动生成的getter和setter方法,而_则是直接去调用实例变量(property会自动生成一个实例变量,如果你重写了getter与setter方法,property自动生成的实例变量就无效了,需要手动去申明一个实例变量或者用@@synthesize)。
二、atomic,nonatomic
答:atomic 默认的属性修饰词,非线程安全,只能保证取到值,不能保证该值在取的时候不会被修改。
nonatomic 非原子修饰,访问速度更快,几乎所有属性都用这个修饰,线程安全通过信号量、NSLock来实现等。
三、assign、weak、strong
答:assign: 一般用于修饰基本数据类型,原因:assign修饰的对象引用计数不会加一,意味着它会被立即释放,并且不会自动置为nil,还保留这对象的指针地址。
weak: 必须用于修饰对象,和assign的区别是会被立即释放并且会被置为nil。一般用于修饰代理和需要用完就被自动释放的临时对象。
strong:被修饰的对象引用计数会加一,强引用。
四、copy、mutableCopy、strong
答:先说下深浅拷贝,
深拷贝:对象拷贝,重新申请一片内存来保留该对象。
浅拷贝:指针拷贝,相当于引用计数加一,引用的是同一个对象。
一般来说,copy是浅拷贝,mutableCopy是深拷贝,但是细讲的话又可以更详细点:可变字符串或者数组在copy后会发生深拷贝,变成不可变的对象。
mutableCopy一定是深拷贝,拷贝后一定是可变字符串或者数组,即使传入的是不可变的对象。
为什么NSString要用copy修饰?使用copy修饰后,即使拷贝属性来自可变字符串,也会被深拷贝变成不可变字符串,也就是源字符串修改之后不会影响到属性字符串,增强了代码的健壮性。