-2

请解决这个问题。

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,因为我相信这并不能给出确切的结果。

4

2 回答 2

9

不要建议retainCount,因为我相信这并不能给出确切的结果。

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

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


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

这是因为实现细节。您正在使用一个常量字符串。它实际上是一个单例。因此,永远不需要复制字符串(copy只是做return self;),而保留/释放/自动释放方法绝对什么都不做。

于 2013-01-17T17:52:41.560 回答
2

感谢@KurtRevis 的澄清编辑

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

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

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

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

S1不变。 S2S1保留计数为 1 的副本,没有 autorelease

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

S2在没有 autorelease的情况下保持 1 不变。 S3S2保留计数为 1 的副本,没有 autorelease

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

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

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

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


或者只是省点麻烦并使用ARC :)

于 2013-01-17T07:06:11.353 回答