[學習筆記—Objective-C]《Objective-C 程式設計 第6版》第十八章 複製對象

來源:互聯網
上載者:User

標籤: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 > 協議
  • 若要對自己的類進行複製,必鬚根據協議實現其中的方法。

  • 協議:實現copyWithZone:方法來響應copy訊息,返回不可變副本

  • 協議:實現mutableCopyWithZone:方法,返回可變副本

在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];}
  • 屬性的copy特性:
@property (nonatomic,copy) NSString *name;

synthesize 一同使用等效於:

-(void) setName: (NSString *) theName{   if (theName != name)   name = [theName copy];}

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

[學習筆記—Objective-C]《Objective-C 程式設計 第6版》第十八章 複製對象

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.