属性的设置

来源:互联网 发布:我的战争mac修改器 编辑:程序博客网 时间:2024/06/05 10:11

1). readwrite 是可读可写特性;需要生成getter方法和setter方法时

2). readonly 是只读特性 只会生成getter方法 不会生成setter方法 ;不希望属性在类外改变

3). assign 是赋值特性,setter方法将传入参数赋值给实例变量;仅设置变量时;

4). retain 表示持有特性,setter方法将传入参数先保留,再赋值,传入参数的retaincount会+1;

5). copy 表示赋值特性,setter方法将传入对象复制一份;需要完全一份新的变量时。

6).nonatomic 非原子操作,决定编译器生成的setter getter是否是原子操作,atomic表示多线程安全,一般使用nonatomic。

7). weak  weak 和strong的区别:weak和strong不同的是 当一个对象不再有strong类型的指针指向它的时候 它会被释放 ,即使还有weak型指针指向它。一旦最后一个strong型指针离去 ,这个对象将被释放,所有剩余的weak型指针都将被清除。


block: weak

delegate:weak

NSString: copy


weak:

什么情况使用 weak 关键字?

  1. 在 ARC 中,在有可能出现循环引用的时候,往往要通过让其中一端使用 weak 来解决

  2. 自身已经对它进行一次强引用,没有必要再强引用一次,此时也会使用 weak,自定义 IBOutlet 控件属性一般也使用 weak;当然,也可以使用strong。在下文也有论述:《IBOutlet连出来的视图属性为什么可以被设置成weak?》

不同点:

  1. weak 此特质表明该属性定义了一种“非拥有关系” (nonowning relationship)。为这种属性设置新值时,设置方法既不保留新值,也不释放旧值。此特质同assign类似, 然而在属性所指的对象遭到摧毁时,属性值也会清空(nil out)。 而 assign 的“设置方法”只会执行针对“纯量类型” (scalar type,例如 CGFloat 或 NSlnteger 等)的简单赋值操作。

  2. assigin 可以用非 OC 对象,而 weak 必须用于 OC 对象。当assign用在对象类型时,只是引用指针,不是值。当引用的对象被释放后,assign则指向了一块被释放的内存,如果再调用则会crash。而weak遇到对象释放后,会置为nil,比起来,weak更加安全。


copy:

用途:

  1. NSString、NSArray、NSDictionary 等等经常使用copy关键字,是因为他们有对应的可变类型:NSMutableString、NSMutableArray、NSMutableDictionary;
  2. block 也使用 copy 关键字

    3、用copy声明属性时,不管这个属性self.name mutalbCopy],还是self.name = [NSMutableString stringWith:@"abc"]; 还是name本身就是mutable的,这个name都是不可编辑的。



    copy与retain的区别:

    copy其实是建立了一个相同的对象,而retain不是;

    copy是内容拷贝,retain是指针拷贝;

    copy是内容的拷贝 ,对于像NSString,的确是这样,如果拷贝的是NSArray这时只是copy了指向array中相对应元素的指针.这便是所谓的"浅复制"。


    对象的自定义拷贝

    对象拥有复制特性,必须实现NSCopying,NSMutableCopying协议,实现该协议的copyWithZone方法和mutableCopyWithZone方法

    深拷贝和浅拷贝的区别就在于copyWithZone方法的实现


    第六、copy、mutableCopy和retain之间的关系

    在Foundation对象中,copy是一个不可变的对象时,作用相当于retain

    当使用mutableCopy时,不管源对象是否可变,副本是可变的,并且实现真正意义上的copy

    当我们使用copy一个可变对象时,副本对象是不可变的。


我们先看当属性为retain时,它的setter内部如何实现的:


当属性为copy时,它的setter内部如何实现:


0 0
原创粉丝点击