关键字

什么情况使用 weak 关键字,相比 assign 有什么不同?

什么情况使用 weak 关键字?

  1. 在 ARC 中,在有可能出现循环引用的时候,往往要通过让其中一端使用 weak 来解决,比如: delegate 代理属性
  2. 自身已经对它进行一次强引用,没有必要再强引用一次,此时也会使用 weak

不同点:

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

使用 copy 关键字

用途:

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

解释:用 @property 声明 NSString、NSArray、NSDictionary 经常使用 copy 关键字,是因为他们有对应的可变类型:NSMutableString、NSMutableArray、NSMutableDictionary,他们之间可能进行赋值操作,为确保对象中的字符串值不会无意间变动,应该在设置新属性值时拷贝一份。

copy和mutableCopy区别和用法

浅拷贝(互相影响)

所谓的浅拷贝,就是指只是将对象内存地址多了一个引用,也就是说,拷贝结束之后,两个对象的值不仅相同,而且对象所指的内存地址都是一样的

单层深拷贝

对于不可变的容器类对象(如NSArray、NSSet、NSDictionary)进 mutableCopy 操作,内存地址发生了变化,但是其中的元素内存地址并没有发生变化,属于单层深拷贝。
对于可变集合类对象(如NSMutableArray、NSMutableSet、NSMutableDictionary),不管是进行 copy 操作还是 mutableCopy 操作,其内存地址都发生了变化,但是其中的元素内存地址都没有发生变化,属于单层深拷贝。

深拷贝(互不影响)

所谓深拷贝,就是指拷贝一个对象的具体内容,拷贝结束之后,两个对象的值虽然是相同的,但是指向的内存地址是不同的。两个对象之间也互不影响,互不干扰。

具体代码:

非集合类对象的 copy 和 mutableCopy
我们对一个 NSString 属性进行 copy 和 mutableCopy –》对 NSString 进行 copy 操作,其新对象的内存地址并没有发生变化,改变的只仅仅是指针的地址,但是进行 mutableCopy 操作,其内存地址已经发生了变化,并且指针地址发生变化。我们将内存地址发生了变化的 copy 操作,称之为深拷贝,反之,内存地址没有发生了变化,称之为浅拷贝。
NSMutableString 进行 copy 和 mutableCopy –》对 NSMutableString 进行 copy 操作,其内存地址和指针地址都发生了变化,所以操作是深拷贝,和上面有所不同;进行 mutableCopy 操作,其内存地址和指针地址也都发生了变化,所以也是深拷贝。

总结:在非集合类对象中,对不可变对象进行 copy 操作,只仅仅是指针复制,进行 mutableCopy 操作,是内容复制。
对可变对象进行 copy 和 mutableCopy 操作,都是内容复制。

集合类对象的 copy 和 mutableCopy
对于不可变的集合类对象进行 copy 操作,只是改变了指针,其内存地址并没有发生变化;进行 mutableCopy 操作,内存地址发生了变化,但是其中的元素内存地址并没有发生变化。(单层深拷贝)
对于可变集合类对象,不管是进行 copy 操作还是 mutableCopy 操作,其内存地址都发生了变化,但是其中的元素内存地址都没有发生变化,属于单层深拷贝。

总结:

  1. NSMutableArray多次copy每次都会新建对象而NSArray多次copy只新建一次对象。5
  2. 对于容器而言,其元素对象始终是指针复制,归档的方法实现了真正的元素对象拷贝
  3. 容器内元素对象的唯一性。从数组中取出一个可变字符串,然后修改字符串对象,直接打印数组,数组中的这个字符串元素也会发生改变。
  4. NSArray * array1 = @[@”1”,@”2”,@”3”]; NSArray * array2 = array1; // 只是单纯的多一个指针指向