2

可能重复:
NSString retainCount is 2147483647所需澄清关于retainCount

让说我有命名为MyTestClass.h一类。

有其初始化不同的方式

类结构3个的NSString变量是看起来像

@interface MyTestClass : NSObject { 

    NSString *testString1; 
    NSString *testString2; 
    NSString *testString3; 

} 

@property (nonatomic, retain) NSString *testString1; 
@property (nonatomic, retain) NSString *testString2; 
@property (nonatomic, retain) NSString *testString3; 

@end 

MyTestClass.m

@implementation MyTestClass 

@synthesize testString1, testString2, testString3; 


-(id) init{ 

    self.testString1 = @""; 

    [self setTestString2:@""]; 

    testString3 = @""; 

} 

现在我打算创建一个对象的MyTestClass

MyTestClass *obj = [[MyTestClass alloc] init]; 

我觉得这行代码执行testString1,后testString2testString3retainCounts将。

我纠正我的朋友吗?

我可以知道如果我释放testString3会发生什么?

对此的任何帮助表示赞赏。

感谢

+2

依靠retainCount并不好。我们永远无法确定框架保留了多少次。您可以阅读这篇文章 - > http://www.friday.com/bbum/2011/12/18/retaincount-is-useless/由bbum撰写的精彩文章。基本上依靠内存管理是不好的。 – iNoob 2012-07-05 12:56:05

+0

我将上面的问题链接为重复的,因为它也链接到许多其他相关问题的树上,以及在这种情况下会看到的奇怪结果(2147483647)。看起来,每个人都必须至少体验一次NSString的retainCount的奇怪之处,然后才会意识到retainCount是多么无用(以及为什么ARC将它变成编译器错误是件好事)。 – 2012-07-05 15:44:42

回答

2

既然你在这个例子中retainCount使用文字字符串并不重要(甚至还不如三角形),因为这些字符串对象实际上不能将被dealloc'd。

但是,如果您将一个运行时分配的字符串分配给每个属性,前两个将保留,第三个不会。由于你的属性被声明为retain,并且你在一个中使用了点语法,而在另一个中使用了“setProperty”语法,所以执行相同的setter,并且传递给该setter的对象被保留。第三个例子,您只需将该财产的支持ivar设置为右侧的价值而不影响其所有权。

值得注意的是,retainCount仅作为增量使用,不应被视为显式数字。您绝对不应该明确检查retainCount的值,因为它的绝对值是不可预测的,也是无用的。您似乎在您的问题中理解了这一点,但每当处理retainCount以确保所有相关人员都了解它时,值得重申。

+0

感谢您的快速回复,但是,我可否知道如果我发布testString3.会发生什么情况,我发现没有崩溃!请你解释一下背后的概念。 – 2012-07-05 13:05:40

+1

由于该对象没有分配到堆上,因此它实际上没有任何所有权。像这样静态声明的字符串是NSString类集群的一个具体的子类,它使像调用发布这样的操作无效。在你的例子中最好不要使用这些类型的字符串,因为它们是一种特殊情况,而是使用'stringWithFormat:'声明的字符串或另一种便利构造函数。另外,由于您正在讨论内存管理,我假设您没有使用ARC。 – 2012-07-05 13:09:15

+0

是的。我们没有使用ARC,并让你知道我是一个新手:)。请你澄清一点。如果我调用self.testString1 = @“hai”,会发生什么情况;两次?我认为它会泄漏记忆。第一个保留的字符串不会被释放。我是否需要重写“setTestString1”方法并在第二次设置字符串之前进行释放调用? – 2012-07-05 13:20:20