簡體   English   中英

目標C - 分配,復制,保留

[英]Objective C - Assign, Copy, Retain

我是Objective C的新手。我有C的基本知識,包括指針的概念。 我有兩個基本問題:

  1. 有人能解釋分配,復制和保留之間的區別嗎?
  2. 如何處理返回指針變量的函數,以及如何通過返回指針執行消息傳遞?

更新了更改文檔的答案

現在,這些信息分散在文檔中的幾個指南中。 這是一個必讀的列表:

現在,這個問題的答案完全取決於您是使用ARC管理的應用程序(新項目的現代默認設置)還是強制手動內存管理。

賦值與弱 - 使用assign設置屬性指向對象地址的指針,而不保留它或以其他方式策划它; 如果取消分配分配給它的對象,則使用weak使屬性自動指向nil。 在大多數情況下,如果不進行適當的清理,您將需要使用弱,因此您不會嘗試訪問已釋放的對象(非法訪問內存地址 - “ EXC_BAD_ACCESS ”)。

保留與復制 - 聲明的屬性默認使用retain (因此您可以完全省略它)並自動管理對象的引用計數,無論是將另一個對象分配給屬性還是將其設置為nil; 使用copy自動發送新分配的對象a -copy消息(它將創建傳遞的對象的副本並將該副本分配給屬性 - 在某些情況下有用(甚至是必需的),在這種情況下,被分配的對象可能被修改后設置為某個其他對象的屬性(這意味着修改/變異也適用於該屬性)。

iOS參考庫中的“ 內存管理編程指南”具有通過類比和示例進行分配,復制和保留的基礎知識。

copy復制一個對象,並以retain count為1返回它。如果復制一個對象,則擁有該副本。 這適用於包含單詞copy的任何方法,其中“copy”指的是要返回的對象。

retain將對象的保留計數增加1.取得對象的所有權。

release減少對象的保留計數1.放棄對象的所有權。

NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:@"First",@"Second", nil];
NSMutableArray *copiedArray = [array mutableCopy];
NSMutableArray *retainedArray = [array retain];

[retainedArray addObject:@"Retained Third"];
[copiedArray addObject:@"Copied Third"];

NSLog(@"array = %@",array);
NSLog(@"Retained Array = %@",retainedArray);
NSLog(@"Copied Array = %@",copiedArray);

array = (
    First,
    Second,
    "Retained Third"
)
Retained Array = (
    First,
    Second,
    "Retained Third"
)
Copied Array = (
    First,
    Second,
    "Copied Third"
)
  1. 分配

    • assign是默認屬性
    • assign是一個屬性屬性,告訴編譯器如何合成屬性的setter實現
  2. 復制:

    • 當對象是可變的時,需要復制
    • copy返回一個對象,您必須在非垃圾回收環境中顯式釋放(例如,在dealloc中)
    • 完成后需要釋放對象,因為您保留了副本
  3. 保留:

    • 指定新值應該在賦值時發送“-retain”並且舊值發送“-release”
    • 如果你寫保留它將自動工作像強
    • 像“alloc”這樣的方法包含一個隱含的“保留”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM