请解决这里在Objective C中保留NSString对象的数量

时间:2013-01-17 06:47:42

标签: objective-c memory-management copy retaincount

请解决此问题。

NSString *S1 = @"abc";
//retain count of s1 ??

NSString *S2 = [S1 copy];
//retain count of s2 and s1 ??

NSString *S3 = [S2 copy];
//retain count of s3 and s2 ??

NSString *S4 = [S3 retain];
//retain count of s4 and s3 ??

NSString *S1 = @"xyz";
//retain count of s1, s2, s3 and s4 ??

不建议retainCount,因为我认为这不会给出确切的结果。

2 个答案:

答案 0 :(得分:9)

  

不建议使用retainCount,因为我认为这并不准确   结果

正确。 retainCount没用。 www.whentouseretaincount.com

您只能将保留计数作为增量进行有用的推理。


要回答您的问题,对于该代码,保留计数是一个常量,并且没有任何代码行实际上做了很多事情。在该代码的末尾,S2,S3和S4都将具有相同的值;将指向相同的字符串(显然,S1将指向不同的字符串)。

这是因为实施细节。您正在使用常量字符串。实际上,它是一个单身人士。因此,永远不需要复制字符串(copy只做return self;),而retain / release / autorelease方法绝对没有。

答案 1 :(得分:2)

感谢@KurtRevis的澄清

假设ARC已关闭,当然,您可以自己测试一下。但是你可能不明白为什么你会得到这些结果。这是你应该得到的以及为什么。

NSString *S1 = @"abc";
//retain count of s1 ??

S1是一个常量字符串文字,只要您的应用程序正在运行,它就永远不会留下内存。所以保留计数有点无关紧要。

NSString *S2 = [S1 copy];
//retain count of s2 and s1 ??

S1没有变化。 S2S1的副本,保留计数为1,没有自动释放

NSString *S3 = [S2 copy];
//retain count of s3 and s2 ??

S2在1 时保持不变,没有自动释放S3S2的副本,保留计数为1,没有自动释放

NSString *S4 = [S3 retain];
//retain count of s4 and s3 ??

S4S3现在将指向同一个对象。而且这个对象现在的保留计数为2,具有自动释放功能。一旦触发自动释放,它的保留计数为1,并且不会被释放。

NSString *S1 = @"xyz";
//retain count of s1, s2, s3 and s4 ??

用于指向的旧对象S1未更改,它是内存中的持久字符串。现在S1指向一个新字符串,其处理方式与S1过去指向的字符串相同。


或者只是省去一些麻烦并使用ARC:)