1

当我使用复制,保留 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;

name1 和 name2 的保留计数是多少?

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

name1 和 name2 的保留计数是多少?

4

1 回答 1

6

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

在您的示例中,对于第一个示例,name1两者newString1都是指向同一对象的指针,该对象的保留计数保持不变。只有当您明确调用保留时,它才会上升。与name2和相同newString2。在第二个示例中,您正在分配 NSString 对象的实例,因此新实例的保留计数为 1。anotherString1并且再次保持不变,因为您没有释放或保留它们。anotherString2name1name2

您的第二个示例与copy. 虽然retain只是增加一个对象的保留计数,但copy创建一个具有自己保留计数的新对象。此处要标记的相关内容是在您的属性声明name1中。name2如果您设置这些属性,它们的行为将与我在此处描述的一样,name1保留NSString您在此处设置的属性并将name2其复制为新对象。

对所有这一切的另一个很好的概述是here ,底部有一个更详细讨论的链接。

综上所述,在 OS X 中,您可以使用垃圾回收,在 iOS 5 中,可以使用自动引用计数。这些可以显着减少,如果不能消除,你需要担心这些东西。

于 2012-01-03T07:39:56.590 回答