標籤:ios ios開發 objective-c
origin = pt;
- 將對象
pt
的地址複製到origin
中。兩個變數都指向記憶體中同一個地址
- Foundation對象:將一個變數賦值給另一個對象僅僅建立了另一個對這個對象的引用(地址)。
Part 1.copy 和 mutablecopy 方法:建立對象的副本
dataArray2 = dataArray;//建立了記憶體中同一數組對象的另一個引用:總共一個數組
dataArray2 = [dataArray mutalbeCopy];//建立信的dataArray副本並複製了所有元素:總共兩個數組
- 注意:可以建立可變對象的不可變副本。也可以建立不可變對象的可變副本。
Part 2. 淺複製與深複製Part 2.1 淺複製
NSMutableArray *dataArray = [NSMutableArray arrayWithObjects: [NSMutableString stringWithString:@"one"], [NSMutableString stringWithString:@"two"], [NSMutableString stringWithString:@"three"],nil]; NSMutableArray *dataArray2; NSMutableString *mStr; dataArray2 = [dataArray mutableCopy]; //兩個數組(dataArray,dataArray2)的元素都指向記憶體中同一個字串,等同於一個對象賦值給另一個對象,屬於淺複製 mStr = dataArray[0]; //檢索dataArray第一個元素 dataArray[0]返回的對象和dataArray中的一個元素指向記憶體中的同一個對象。 [mstr appendString:@"ONE"]; //改變mstr的同時改變了dataArray的第一個元素。由於淺複製,dataArray2也發生了改變,因為淺複製只是複製了對象的引用,內容被更改即被更改。
Part 2.2 深複製
- 建立數組中每個對象內容的副本,而不僅僅是這些對象引用的副本。
- 更改dataArray2中的第一個元素,而不改變dataArray的第一個元素:
mStr = [NSMutableString stringWithString: dataArray2[0]];//建立一個新字串,並儲存到dataArray2的第一個位置。[mStr appendString @"ONE"];[dataArray2 replaceObjectAtIndex: 0 withObject: mStr];//更改mStr並添加得到數組中
Part 3. 實現 < NSCopying > 協議
在Fraction類建立新的分數
@interface Fraction: NSObject <NSCopying>-(id) copyWithZone: (NSZone *)zone{ Fraction *newFact = [[Fraction allocWithZone: zone] init]; [newFact setTo: numerator over: denominator]; return newFact;}
Fraction *f1 = [[Fraction alloc]init];Fraction *f2;[f1 setTo: 2 over 5];f2 = [f1 copy]; //產生f1的副本,產生新的Fraction,將f1複製其中[f2 setTo: 1 over: 3];[f1 print]; // 2/5 複製的操作對f1沒有影響[f2 print]; // 1/3
注意:
- 如果將copy語句改成 f2 = f1,則改變f2的同時會改變f1。
- 如果產生此類的子類,copyWithZone:方法將被繼承:
Fraction *newFact = [[Fraction allocWithZone: zone] init];應該改為:id newFract = [[self class allocWithZone: zone] init];
Part 4. 用設值方法和取值方法複製對象
賦值:
newCard.name = newName; //設定對象(AddressCard)的名稱(姓名)
設值方法:
-(void) setName: (NSString *) theName{ name = theName; //簡單將參數賦值給了相應的執行個體變數}
如果修改了newName的字元
為了避免改變其他對象的值,比較安全的做法是在設值方法中將對象複製一份。
使用copy版本的setName方法:
-(void) setName: (NSString *) theName{ name = [theName copy];}
@property (nonatomic,copy) NSString *name;
與synthesize
一同使用等效於:
-(void) setName: (NSString *) theName{ if (theName != name) name = [theName copy];}
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
[學習筆記—Objective-C]《Objective-C 程式設計 第6版》第十八章 複製對象