平時我們使用物件之間的傳值都是採用retain count +1的方式,這種方式的適用於當物件的某屬性的值改變時,引用該物件的不同指標會同時改變,因為這兩個指標指向的是同乙個記憶體位址,
但如果需求是,當乙個指標執行的物件屬性值發生改變時,不影響另乙個物件,那麼需要分配兩個不同的記憶體位址,也就是說,我們就不可以採用retain關鍵字了,而是要採用copy 關鍵字,因為copy關鍵字會在複製時重新建立乙個新的物件。 舉例說明一下copy使用
這裡建立乙個person類
person.h,**:
@inte***ce person : nsobject
@property (nonatomic, retain) nsstring *name;
@property (nonatomic,retain)nsstring *email;
@end
person.m檔案
#import 「person.h」
@synthesize name,email;
- (id)initwithname:(nsstring *)thename andemail:(nsstring *)theemail
}- (id)copywithzone:(nszone *)zone
- (void)delloc
這裡說明一下,
在物件之間copy,首先需要類是繼承自nsobject,其次需要實現協議,最後在方法中實現
- (id)copywithzone:(nszone *)zone 方法
如果沒有此方法那麼在copy物件,程式會直接宕機,並提示person類找不到copywithzone方法。
這裡還有一點需要注意的是,通常在nsarray之間copy,是retain方式的複製,也就是直接將引用係數+1,
如下 **:
nsarray *array1 = [[nsarray alloc] initwithobjects:person1,person2,person3,nil];
nsmutablearray *array2 = [array1 copy]; 或使用
nsmutablearray *array2 =[ [nsmutablearray alloc] initwitharray:array1];
如果想使用兩個不同記憶體,那麼就需要使用到nsarray 的deep copy,例如:
nsarray *array1 = [[nsarray alloc] initwithobjects:person1,person2,person3,nil];
nsmutablearray *array2 = [[nsmutablearray alloc] initwitharray:array1 copyitems:yes];
**:
strong 和 copy關鍵字的區別
記憶體管理 1.什麼是arc?arc是automatic reference counting自動引用計數,在程式編譯時自動加入retain release。在物件被建立時retain count 1,在物件被release時count 1,當count 0時,銷毀物件。程式中加入autorelea...
this關鍵字使用
一,表示類中屬性 1,沒有使用this的情況 class person public string getinfo public class thisdemo01 執行結果 姓名 null,年齡 0 可以得出結論 此時並沒有正確將內容賦給屬性 假設身邊有乙隻筆,遠處也有乙隻筆,肯定會就近拿身邊的筆。...
this關鍵字的使用
我們曾經曰 起名字要做到見名知意。this 是當前類的物件引用。簡單的記,它就代表當前類的乙個物件。注意 誰呼叫這個方法,在該方法內部的this就代表誰。this的場景 解決區域性變數隱藏成員變數 定義學生類 class student 姓名設定值 public void setname strin...