1.@property作用
声明变量的setter、getter的方法接口。
2.@synthesize作用
实现变量的setter、getter的方法,如果找不到实例变量,则主动创建一个。
3.nonatomic与atomic
atomic:设置成员变量时,默认为原子操作,提供线程安全。意思是该属性是变量默认就有的,是为了保证在多线程的情况下,编译器会自动产生一些互斥加锁的代码,避免变量的不同步问题。
nonatomic:禁止多线程,变量保护,提高性能。就是说如果该对象无需考虑多线程的话,这个属性会让编译器少生成一些互斥代码,提高效率。
atomic 的意思是setter/getter 这个函数,是一个原语操作,如果有多个线程同时调用setter的话,不会出现某一个线程执行完setter全部语句之前,另一个线程就开始执行setter情况,相当于函数头尾加了锁一样,可以保证数据的完整性。nonatamic 不保证setter/getter 的原语性,所以你可能会取到不完整的东西。因此,在多线程的环境下的原子操作是非常必要的,否则有可能会引起错误的结果。
比如setter函数里改变了两个成员变量,如果你用nonatomic的话,getter 可能会取到只更改了其中一个变量时候的状态,这样取到的东西会有问题,就是不完整的。当然如果不需要多线程支持的话,用nonatomic就够了,因为不涉及到线程锁的操作,所以它执行效率相对快些。
例如加了atomic的例子:
{lock}
if(proprity!=newValue){
[property release];
property = [newValue retain];
}
{unlock}
所以,atomic 会在多线程设值取值的时候加锁,中间的执行层是处于被保护的一种状态,atomic 是oc使用的一种线程保护技术,基本上讲,就是防止在写入未完成的时候被另外一个线程读取,造成数据错误。而这种机制是耗费系统资源的,所以在iPhone这种小型设备上,如果没有使用多线程间的通讯编程,那么nonatomic是一个非常好的选择!
4.assign、copy、retain
assign:简单的赋值,不更改引用计数。基础数据类型(NSInteger)和C数据类型(int、float、double、char等)。
copy:建立一个索引计数为1的对象,然后释放旧对象。
比如一个NSString对象,地址为0×1111,内容为@”STR”
Copy到另外一个NSString之 后,地址为0×2222,内容相同,新的对象retain为1, 旧有对象没有变化。
所以copy是内容拷贝,改变内存地址,拷贝之前,释放旧有对象。
retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1。
retain到另外一个NSString之 后,地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的retain值+1。
retain是指针拷贝,拷贝后的对象指向同一块内存,拷贝之前,释放旧有对象。
5.strong和weak
strong和weak修饰符的简单理解:
首先一个对象可以有多个拥有者,即A和B两个strong的指针同时指向一个NSString的对象“hello”,当A和B两个strong的指针同时指向一个NSString的对象“hello”,当A指向另一个NSString对象“hi”时,此时B仍指向“hello”,当B也指向“hi”或其他任何一个对象时,“hello”这个对象就会在内存中被删除。
如果B是一个weak类型的指针,则当strong类型的A指针指向其他对象时,因为B是一个weak类型的指针,此时B没有指向。