將一個變量賦值給另一個對象僅僅創建另一個對這個對象的引用。
類似于Java中,賦值是一個引用。
參考C++或者C的指針來理解就容易了。這里的賦值其實就是指針地址賦值而已。
Foundation類實現了名為copy 和 mutableCopy的方法,可以使用這些方法創建對象的副本。
通過實現一個符合協議(用于制作副本)的方法來完成此任務。
注意,產生一個對象的可變副本并不要求被復制的對象本身是可變的。同樣,可以創建可變對象的不可變副本。
### 淺復制和深復制:
mutableCopy方法復制數組時,在內存中為新的數組對象分配了空間,并且將單個元素復制到新數組中。
然后將原始數組中的每個元素復制到新位置意味著:僅將引用從一個數組元素復制到另一個數組元素。
這樣做的結果,就是兩個數組中的元素都指向內存中的同一個字符串。
若要為數組中的每個元素創建完全不同的副本,需要執行所謂的深復制。
### 實現協議:
注意,如果想要區分可變副本和不可變副本,
還需要根據協議實現mutableCopyWithZone:方法。
如果兩個方法都實現,那么copyWithZone:應該返回不可變副本,
而mutableCopyWithZone:將返回可變副本。
屬性并沒有mutableCopy特性。
即使是可變的實例變量,也是使用copy特性,正如方法copyWithZone:的執行結果。
所以,按照約定會生成一個對象的不可變副本。