在NSString中复制,保留和引用计数

时间:2012-01-03 07:22:21

标签: objective-c ios copy retain retaincount

当我使用copy时保留了什么,保留NSString属性并将其分配给局部变量?

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

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

如果我将string的值赋给另一个NSString变量,如:

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

什么将保留name1和name2的数量?

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

这里的name1和name2的保留计数是什么?

1 个答案:

答案 0 :(得分:6)

当您分配一个对象时,它的保留计数从1开始。每次保留时,它会上升一个,每次释放时,它都会下降一个。这里的另一个因素是自动释放。当一个对象在自动释放池的上下文中自动释放时,当自动释放池耗尽时,其保留计数将自动减少一个。

在您的示例中,对于第一个示例,name1newString1都将指向相同的对象,该对象的保留计数保持不变。只有在明确调用retain时它才会上升。与name2newString2相同。在第二个示例中,您将分配NSString对象的 new 实例,因此新的anotherString1anotherString2将保留计数为1. {{1}和name1将保持不变,因为你没有释放或保留它们。

您的第二个示例与name2基本相同。虽然copy只是递增对象的保留计数,但retain会创建一个具有自己的保留计数的新计数。此处标记的相关内容在您的copyname1声明属性中。如果你设置了这些属性,它们的行为就像我在这里描述的那样name2保留你在那里设置的name1NSString将其复制为新对象。

所有这一切的另一个很好的概述是here,底部有更多detailed discussion的链接。

总而言之,在OS X中,您可以使用垃圾收集,在iOS 5上,automatic reference counting。这些可以显着减少,如果不是消除,你需要担心这些东西。