oc自學 複製物件

2021-07-05 06:23:37 字數 2704 閱讀 8174

copy和mutablecopy方法

可以使用這些方法建立物件的副本。

dataarray2 = [dataarray mutablecopy];

//在記憶體中建立乙個新的dataarray副本,並複製了它所有元素。

[dataarray removeobjectatindex: 0];

//刪除了dataarray2的第乙個元素,但卻不刪除dataarray中的第乙個元素。

淺複製與深複製

淺複製:意味著使用mutablecopy方法複製陣列時,在記憶體中為新的陣列物件分配了空間,並且將單個元素複製到新陣列中。然而將原始陣列中的每個元素複製到新位置意味中:僅將引用從乙個陣列元素複製到另乙個陣列元素。這樣做的最終結果,就是這兩個陣列中的元素都指向記憶體中的同乙個字串。

深複製:意味著要建立陣列中每個物件內容的副本。然而使用foundation類的copy或mutablecopy方法時,深複製並不是預設執行的。使用foundation的歸檔功能來建立物件的深複製。

假設要更改dataarray2的第乙個元素,但不更改dataarray的第乙個元素,可以建立乙個新字串(stringwithstring:之類的方法),並將它儲存到dataarray2的第乙個位置。

mstr = [nsmutablestring stringwithstring: dataarray2[0]];

然後,可以更改mstr,並使用replaceobjectatindex:withobject:方法將它新增到陣列中,

[dataarray2 replaceobjectatindex: 0 withobject: mstr];

即使替換了陣列中的物件之後,mstr和dataarray2的第乙個元素仍指向記憶體中的同乙個物件。這意味著隨後在程式中對mstr做的修改也將更改陣列的第乙個元素。

實現協議

要實現事項自己的類進行複製,必須根據協議實現其中一兩個方法。

如果這些類時任何foundation類的子類,那麼可能需要實現較為複雜的複製策略。必須考慮這樣乙個事實:超類可能已經實現了它自己的複製策略。

實現協議時,類必須實現copywithzone:方法來響應copy訊息(這條copy訊息僅將一條帶有nil引數的copywithzone:訊息傳送給你的類)。如果想要區分可變副本和不可變副本,還需要根據協議實現mutablecopywithzone:方法。如果兩個方法都實現,那麼copywithzone:應該返回不可變副本,二mutablecopywithzone:將返回可變副本。產生物件的可變副本並不要求被複製的物件本身也是可變的;想要產生不可變物件的可變副本是很合理的。

@inte***ce fraction: nsobject

-(id) copywithzone: (nszone *) zone

fraction *newfract = [[fraction allocwithzone: zone] init];

[newfract setto: numerator over: denominator];

return newfract;

@end

引數zone與不同的儲存區有關,可以在程式中分配並使用這些儲存區。

如果編寫乙個類的copywithzone:方法,而該類的超類也實現了協議,那麼應該先呼叫超類的copy方法一複製繼承來的例項變數,然後加入自己的**已複製想要新增到該類中任何附加的例項變數。

用設定方法和取值方法複製物件

只要實現設定和取值方法,都應該考慮例項變數中儲存的內容、要檢索的內容和是否需要保護這些值。

他們都是引用到相同的字元

-(void) setname: (nsstring *) thename

name = thename;

// name = [thename copy];

@property (nonatomic,copy) nsstrin *name;

與@synthesize指令一起使用,生成的方法與下面的方法行為相似:

-(void) setname: (nsstring *) thename

if (thename != name)

name = [thename copy];

此處使用nonatomic是為了告訴系統不要使用互斥(mutex)鎖定保護屬性的訪問方法。編寫執行緒安全**的人會使用互斥鎖定防止同一段**中兩個執行緒同事執行。然而這種鎖定也會讓程式變慢,如果知道這段**只會在單執行緒中執行,就可避免使用這種鎖定方法。

如果未指定nonatomic或者指定了atomic)(預設),使用互斥鎖可以波阿虎例項變數,能夠保證獨佔訪問乙個例項變數,並且能夠阻止潛在的競爭條件的發生,比如在多執行緒的程式中多個執行緒試圖並訪問同樣的例項變數。

屬性並沒有mutablecopy特性。即使是可變的例項變數,也是使用copy特性,正如方法copywithzone:的執行結果。所以,會生成乙個不可變副本。

如果返回乙個可變物件,那麼必須確保對返回值的更改不影響你的例項變數的值。這樣,可以生成例項的副本,並將它替代原始值作為返回值。

回到copy方法的實現,如果正在複製的例項變數包含不可變的物件,那麼可能不需要生成這個物件內容的新副本。僅通過保持該物件來生成它的新引用,可能就足夠了。

OC自學筆記

變數資料修飾 auto register extern static 預設auto int i 0 等於 auto int i 0 register高效變數 register int i 0 分配數量有限,跟系統有關,可能會降為auto extern全域性變數 extern int i 0 相同專案...

oc自學 使用檔案

foundation框架允許你利用檔案系統對檔案或目錄執行基本操作。這些操作是有nsfilemanager類提供的,具有如下功能 建立乙個新檔案,從現有檔案中讀取資料,將資料寫入檔案,重新命名檔案,刪除檔案,測試檔案是否存在,確定檔案的大小和其他屬性,複製檔案,測試兩個檔案的內容是否相同。上面的多數...

OC 屬性 深複製 淺複製

main.m import import human.h int main int argc,const char argv return 0 human.h import inte ce human nsobject property null resettable nonatomic,copy ...