gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 17:45:01 26 4
gpt4 key购买 nike

当我使用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;

名称1和名称2的保留计数是多少?
NSString *anotherString1 = [NSString alloc]initWithString:name1];
NSString *anotherString2 = [NSString alloc]initWithString:name2];

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

最佳答案

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

在您的示例中,对于第一个示例,name1newString1都将是指向同一对象的指针,并且该对象的保留计数保持不变。仅当您显式调用保留时,它才会上升。与name2newString2相同。在第二个示例中,您正在分配一个NSString对象的新实例,因此新实例anotherString1anotherString2的保留计数为1。再次,因为您没有释放或保留它们,所以name1name2保持相同。 。

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

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

总而言之,在OS X中,您可以使用垃圾回收,而在iOS 5上,可以使用automatic reference counting。这些可以显着减少(如果不能消除的话)您需要担心的事情。

关于objective-c - 在NSString中复制,保留和引用计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8709086/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com