请解决此问题。
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
,因为我认为这不会给出确切的结果。
答案 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
没有变化。 S2
是S1
的副本,保留计数为1,没有自动释放。
NSString *S3 = [S2 copy];
//retain count of s3 and s2 ??
S2
在1 时保持不变,没有自动释放。 S3
是S2
的副本,保留计数为1,没有自动释放。
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:)