objective-c -- property
@property、objective-c
1、”.”语法可能调setter,也可能调getter
1 |
|
2、可改变存取器的名字
getter= 让getter方法使用自定义的名字
setter = 让setter方法使用自定义名字
@property(getter=isRunning) BOOL running
使用方法:
1 |
|
3、readonly不合成setter方法
4、nonatomic属性
原子性(Atomicity)的作用是属性在多线程的环境中怎么行为。当你不仅仅有一个线程, 那么getter和setter可能会在同一时间去调用,这就意味着getter/setter可能会被另一个方法打扰,很有可能造成数据错误。
原子的属性会封锁object,防止这种情况发生,确保get或者set操作的操作对象是完整的。没有被损坏。然而,这仅仅是一个线程安全的方面,我们必须要理解这一点。使用原子性并不能确保我们的代码就是线程安全的
5、strong属性
无论对象被指定为什么属性,强壮的属性可以创建拥有关系,这对所有对象属性来说是一种内隐行为,它默认是安全的,因为只要它被指定为strong属性,它就会确保对对象的值存在
举个例子:
1 |
|
它的实现如下,@property产生的使用的默认存储方法,也重写了NSObject的描述方法,返回一个代表该对象的字符串
1 |
|
然后,添加Person的属性给Car,改变Car.h:
1 |
|
接着
1 |
|
只要driver是一个strong关联,honda对象就会持有john,这确保只要honda需要它,它就会有效
6、weak 属性
在属性和指定value之间创建一个不拥有关系,使用这个防止循环引用。
大多数情况下,强属性可以直观知道你想要什么对象属性,强引用会暴漏一个问题,例如,我们需要从driver引用他正在开的Car对象,首先,我们需要给Person添加一个car属性:
Person.h
1 |
|
@class Car 是对Car类的前声明,就像它告诉编译器,“相信我,Car类是存在的,所有不要想着去立刻找到它”。我们不用#import这样做,因为Car也导入了Person.h,那样我们会陷入无尽的导入循环
然后,添加下面的代码,在honda、driver分配后:
1 |
|
这样我们现在有一个现象,就是john拥有honda,honda拥有john。这就意味着他们相互拥有,所以尽管他们不再有用,内存管理系统也不能够释放他们。
这叫做 retain cycle(保持循环),是一种内存泄露的形式,内存泄露是很不好的。幸运的是,要想解决这个办法很简单,只需要告诉其中一个属性维持一个weak属性引用另一个对象。在Person.h中,改变car的声明:
@property(nonatomic,weak)Car *car;
这种weak(弱)属性会给car创建一个非拥有关系。它允许john有一个honda的引用,同时避免了保持循环。但是,还有一个可能性就是honda会被销毁,而这个时候john正在引用honda,如果这种情况发生,weak属性会很方便地设置car为nil,去避免悬挂指针。
7、 copy属性
它是strong的替代品,不是保持拥有一个存在的对象,而是创建一个引用,无论你指定什么属性,都会持有这个拥有。只有符合NSCopying protocol的对象才能使用这个属性。
代表值的属性(相对于链接或关系)是一个使用copy的不错选择。例如,开发者通常复制字符串属性,而不是强引用它们
strong是引用,copy是复制一份,保存当时的值,无论原对象值如何变化
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!