2012-01-03 27 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