[英]Objective C - Assign, Copy, Retain
我是Objective C的新手。我有C的基本知識,包括指針的概念。 我有兩個基本問題:
更新了更改文檔的答案
現在,這些信息分散在文檔中的幾個指南中。 這是一個必讀的列表:
現在,這個問題的答案完全取決於您是使用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"
)
分配
復制:
保留:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.