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

Tin*_*nku 1 copy objective-c retain ios retaincount

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

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

@property (nonatomic, retain) NSString* name1;
@property (nonatomic, copy) NSString *name2; 
Run Code Online (Sandbox Code Playgroud)

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

NSString *newString1 = name1;
NSString *newString2 = name2;
Run Code Online (Sandbox Code Playgroud)

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

NSString *anotherString1 = [NSString alloc]initWithString:name1];
NSString *anotherString2 = [NSString alloc]initWithString:name2];
Run Code Online (Sandbox Code Playgroud)

这里名字1和名字2的保留计数是多少?

Ste*_*les 6

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

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

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

这里有另一个很好的概述,可以底部找到更详细的讨论.

总而言之,在OS X中,您可以使用垃圾收集,并在iOS 5上自动引用计数.这些可以显着减少,如果不是消除,你需要担心这些东西.