Object C 複製對象

  在簡單的賦值語句中將對象賦值給另一個對象:

origin = pt;
    其中origin 和 pt 都是帶有兩個整型實例變量x和y的XYPoint 對象,這樣的賦值結果僅僅是將對象pt 的地址複製到origin中,賦值操作結束後兩個變量都指向內存中的同一個地址。當使用一條消息對實例變量進行修改:

[origin setX:100 andY:300]
     這時同時改變了origin和pt變量共同引用的XYPoint對象的x,y座標,因爲它們都引用內存中同一個對象

     這樣同時適用於Foundation對象:將一個對象賦值給另一個對象僅僅是創建了一個對這個對象的引用。所以,如果dataArray 和dataarray2 都是NSMutableArray對象:

dataArray2 = dataArray;
[dataArray2 removeObjectAtIndex:0];

     這個操作將對兩個變量引用的同一個數組中刪除第一個元素。

1.  copy和mutableCopy方法

     Foundation 類實現了名爲copy 和mutableCopy的方法,可以使用這些方法創建對象的副本。通過實現符合<NSCopying> 協議(用於製作副本)的方法來完成此任務。如果類必須區分要產生的對象的是可變副本還是不可變副本,還需要<NSMutableCopying>協議實現一個方法。

     如Foundation 類中的copy方法,在前面描述的兩個NSMutableArray對象dataArray2和dataArray, 語句:

dataArray2 = [dataArray mutableCopy]
     在內存中創建一個dataArray副本,並複製了它的所有元素。執行語句:

[dataArray2 removeObjectAtIndex:0]
      上面刪除了dataArray2中的第一個元素,但不刪除dataArray中的第一個元素。  下面代碼詳細展示:

#import <Foundation/Foundation.h>

int main (int argc, char *argv[])
{
    @autoreleasepool{
         NSMutableArray *dataArray = [NSMutableArray arrayWithObjects: @"one",@"two", @"three",nil];
         NSMutableArray *dataArray2;
         //簡單複製
         dataArray2 = dataArray;
         [dataArray2 removeObjectAtIndex:0]   
         NSLog(@"dataArray: ");
         for (NSString *elem in dataArray)
              NSLog(@“%@”,elem);
          
         NSLog (@"dataArray2: ");
         
         for (NSString *elem in dataArray2)
               NSLog (@"%@",elem);
         //創建一個可變副本
         dataArray2 = [dataArray mutableCopy];
         [dataArray2 removeObjectAtIndex:0];
         NSLog (@"dataArray: ");
         for (NSString *elem in dataArray)
               NSLog(@"%@", elem);
          
         NSLog (@"dataArray2: ");
            for (NSString *elem in dataArray2)
                 NSLog (@" %@", elem);
       }
        return 0;
}
         輸出結果:

dataArray:
    two
    three
    four
dataArray2:
    two
    three
    four
dataArray:
    two
    three
    four
dataArray2:
    three
    four
       dataArray2 = dataArray;  僅僅創建了對內存中同一個對象的另一個引用。在從dataArray2中刪除第一個對象後兩個引用中的第一個元素都會消失。

       然後創建一個dataArray的可變副本並將它賦值給dataArray2的最終副本:這在內存中創建了兩個不同的可變數組。

       注意:產生一個對象的可變副本並不要求被複制的對象本身是可變。這種情況同樣適用於不可變副本:可以創建可變對象的不可變副本。
2. 淺賦值與深複製



發佈了42 篇原創文章 · 獲贊 9 · 訪問量 28萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章