iOS声明变量的关键字解析

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”这个对象就会在内存中被删除。


iOS声明变量的关键字解析_第1张图片

如果B是一个weak类型的指针,则当strong类型的A指针指向其他对象时,因为B是一个weak类型的指针,此时B没有指向。

iOS声明变量的关键字解析_第2张图片

你可能感兴趣的:(iOS声明变量的关键字解析)