nonatomic, retain,weak,strong用法详解

strong weak

strong与weak是由ARC新引入的对象变量属性

ARC引入了新的对象的新生命周期限定,即零弱引用。如果零弱引用指向的对象被deallocated的话,零弱引用的对象会被自动设置为nil。

@property(strong) MyClass *myObject;

相当于@property(retain) MyClass *myObject;

@property(weak) MyOtherClass *delegate;

相当于@property(assign) MyOtherClass *delegate;

强引用与弱引用的广义区别:强引用也就是我们通常所讲的引用,其存亡直接决定了所指对象的存亡。如果不存在指向一个对象的引用,并且此对象不再显示列表中,则此对象会被从内存中释放。弱引用除了不决定对象的存亡外,其他与强引用相同。即使一个对象被持有无数个若引用,只要没有强引用指向他,那麽其还是会被清除。没办法,还是 “强哥” 有面子。

简单讲strong等同retainweak比assign多了一个功能,当对象消失后自动把指针变成nil,好处不言而喻。

__weak, __strong 用来修饰变量,此外还有 __unsafe_unretained, __autoreleasing 都是用来修饰变量的。__strong 是缺省的关键词。__weak 声明了一个可以自动 nil 化的弱引用。__unsafe_unretained 声明一个弱应用,但是不会自动nil化,也就是说,如果所指向的内存区域被释放了,这个指针就是一个野指针了。__autoreleasing 用来修饰一个函数的参数,这个参数会在函数返回的时候被自动释放。

之前写一个基于地理位置应用程序的时候无法让应用程序打开定位功能,在.h文件里面,我定义的属性是这样的:

@property(weak, nonatomic) CLLocationManager *locationManager;

后来,我将上面这句话改为:

@property(nonatomic, retain) CLLocationManager *locationManager;

就可以了。接下来,就详细得介绍一下nonatomic, retain,weak,strong在我们开发iOS程序时,常常会遇到:property 和synthesize,以前很懒没有仔细去理解,只是看了看别人写的书,觉得挺容易的(在这里我不得不说,现在很多本土出的土书,尤其是早期的2009年,写的是真乱,误人子弟),所以今天有时间,自己试验了一番,希望和大家讨论。property,他可以提供的功能有:提供成员变量的访问方法的声明、控制成员变量的访问权限、控制多线程时成员变量的访问环境 )。property不但可以在interface,在协议[url=]protocol[/url].和类别[url=]category[/url]中也可以使用.synthesize的理解是:实现property所声明的方法的定义。其实说直白就像是:property声明了一些成员变量的访问方法 ,synthesize则定义了由property声明的方法。他们之前的对应关系是property 声明方法 ———-》 头文件中申明的方法 synthesize定义方法———》Cpp文件中定义的方法不过这里还有有一点细微的差别,后面我会讲到。先讲property大家都知道:@property(attribute1 , attribute2, …])是@property的他的官方表达方式,所以看到attribute1, attribute2,你就应该懂的, 他的用法不是很简单。下面就对他的属性列表进行分类介绍:下面对属性列表进行一下简单的介绍,后续会用代码来解释。1.可读性:readonly 、readwrite@property(readwrite,….) valueType value;这个属性是变量的默认属性,就是如果你(readwrite and readonly都没有使用,那么你的变量就是readwrite属性),通过加入readwrite属性你的变量就会有get方法,和set方法。property(readonly,…) valueType value;这个属性变量就是表明变量只有可读方法,也就是说,你只能使用它的get方法。2,assign,setter方法直接赋值,不进行任何retain操作,为了解决原类型与环循引用问题3,retain,setter方法对参数进行release旧值再retain新值,所有实现都是这个顺序4,copy,setter方法进行Copy操作,与retain处理流程一样,先旧值release,再Copy出新的对象,retainCount为1。这是为了减少对上下文的依赖而引入的机制。5,nonatomic,非原子性访问,不加同步,多线程并发访问会提高性能。注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问。锁被加到所属对象实例级.所以 不加nonatomic对与多线程是安全的 。其实他们都可以用代码表示:1.nonatomic 和 atomic@property(nonatomic) NSObject* test1;@synthesize test1;上面两句代码,表示我们对test1的访问,是非多线程安全的。@property(atomic) NSObject* test1;@synthesize test1;上面两句代码,表示我们对test1的访问,是多线程安全的。其实也就是在讲该成员变量放到互斥代码中,例如,下面进行加锁。[_internal lock]; // lock using an object-level lockid result = [[value retain] autorelease];[_internal unlock];return result;就如上面所说 ,这两个属性,是出于对多线程条件下 ,对test1的访问安全。如果你的程序的成员变量不存在安全问题,,用nonatomic就好,因为这样不要在访问是进行互斥,效率更高。2. readonly 、readwrite (注,后续过程我们都会加入nonatomic 属性,因为它是十分普遍的)2.1 readonly@property(nonatomic,readonly) NSObject* test1;@synthesize test1;上面的两句代码,objc编辑器将会为我们翻译为:@property(nonatomic,readonly) NSObject* test1; 等同-(NSObject*)test1;return test1;}2.2 readwrite@property(nonatomic,readwrite ) NSObject* test1;@synthesize test1;上面的两句代码,objc编辑器将会为我们翻译为:@property(nonatomic,readwrite ) NSObject* test1; 等同-(NSObject*)test1;return test1;}-(void)settest1(NSObject* other);

这里要说明一下,

也有伤心的,既有令人兴奋的,也有令人灰心的,

nonatomic, retain,weak,strong用法详解

相关文章:

你感兴趣的文章:

标签云: