2012-01-03 63 views
1

當我使用副本時,實際上是什麼意思,保留NSString屬性並將其分配給局部變量?在NSString中複製,保留和引用計數

@interface SomeClass : NSObject 
{ 
    NSString *name; 
    NSString *name2; 
} 

@property (nonatomic, retain) NSString* name1; 
@property (nonatomic, copy) NSString *name2; 

如果我字符串的值賦給像另一個的NSString變量:

NSString *newString1 = name1; 
NSString *newString2 = name2; 

這將是保留NAME 1和NAME的計數?

NSString *anotherString1 = [NSString alloc]initWithString:name1]; 
NSString *anotherString2 = [NSString alloc]initWithString:name2]; 

這裏的name1和name2的保留計數是什麼?

+3

不要關心對象的保留數量,只關心所有權。如果您擁有它,您必須稍後再發布它。如果你不擁有它,你不會釋放它。 – dreamlax 2012-01-03 07:27:12

回答

6

當您分配一個對象時,其保留計數從1開始。每次保留時,它會增加1,每次釋放時,它會減少1。另一個因素是autorelease。當一個對象在自動釋放池的上下文中自動釋放時,當自動釋放池耗盡時,它的保留計數會自動減少1。

在你的例子,對於第一個,name1newString1都將是指針指向相同對象,與該對象的保留計數保持相同。如果你明確地呼叫保留,它只會上升。與name2newString2相同。在第二個示例中,您正在分配一個NSString對象的新實例,所以新的anotherString1anotherString2將保留計數爲1. name1name2將保持不變,因爲您沒有釋放或保留它們。

您的第二個示例與copy基本相同。雖然retain只是增加對象的保留數,但copy會創建一個具有自己的保留數的新保留數。與此相關的標誌是name1name2的聲明。如果你設置了這些屬性,它們將按照我在這裏描述的name1保留您在那裏設置的NSStringname2將其複製爲新對象。

所有這一切的另一個很好的概述是here,鏈接到更底層的更多detailed discussion

這一切都說,在OS X中,你可以使用垃圾回收,並在iOS 5上,automatic reference counting。這些可以顯着減少,如果不是消除,你需要擔心這個東西。

+0

如果我使用newstring2 = [newstring1 retain],那麼newstring1和newstring2的保留次數是多少,如果我使用newstring2 = [newstring1 copy] – Tinku 2012-01-03 08:21:11

+0

將會保留什麼數量第一個'newstring2'將是* newstring1'並且保留數量比它多一個('retain'返回它保留的對象)。在第二個例子中,'newstring2'將是'newstring1'的一個副本,但它們將是*不同的對象*,'newstring1的保留計數沒有改變,並且'newstring2'的保留計數爲1,因爲它剛剛初始化。 – 2012-01-03 18:30:48