【发布时间】:2011-10-17 17:05:20
【问题描述】:
请解释一下下面的代码行,我只是困惑..,
Nsstring *a;
Nsstring *b;
a = [b retain];
a & b 的保留计数是多少。
a = [b copy];
a & b 的保留计数是多少。
提前致谢。
【问题讨论】:
请解释一下下面的代码行,我只是困惑..,
Nsstring *a;
Nsstring *b;
a = [b retain];
a & b 的保留计数是多少。
a = [b copy];
a & b 的保留计数是多少。
提前致谢。
【问题讨论】:
从技术上讲,您发布的情况下的保留计数是不确定的,因为您从未初始化变量。在未初始化的指针上调用retain 可能会崩溃。
其次,您的情况下的保留计数取决于您如何初始化变量。
NSString *a;
NSString *b = @"test";
a = [b retain];
/* Both variables reference the same object which has been retained.
Retain count +1
*/
NSString *a;
NSString *b = @"test 2";
a = [b copy];
/* `a` has a retain count +1 (a variable returned from a `copy`
method has a retain count +1). `b` retain count does not change
(you haven't called `retain` on `b`, so it's count remains the
same.
*/
如果您还没有这样做,您应该阅读Apple's memory management guidelines。此外,除非您有充分的理由不这样做,否则您应该使用ARC,这样您就可以摆脱手动管理内存的大部分麻烦。
在另一个答案的 cmets 中,您询问如何确定对象的保留计数。你总是自己跟踪它。其他对象可能会保留和释放您的字符串,但您不在乎。如果您使用alloc 创建和对象,在对象上调用retain 或copy 对象,您有责任在完成后释放或自动释放该对象。否则不是你的责任。对象的绝对保留计数无关紧要。
【讨论】:
NSString 做了很多疯狂的优化。您示例中的retainCount 都返回NSUInteger 中允许的最大整数。这就是为什么您不应该使用任何对象的retainCount 的另一个原因。
NSString 没有有意义的保留计数。但是,如果您将其用作一般示例,则查找具有正常保留计数的对象的保留计数的方法是:
[a retainCount]
【讨论】:
retainCount。这是一个实现细节,对任何实际应用几乎没有用处。
retainCount 上的文档甚至包括一个大注释,开头是:“重要提示:此方法通常在调试内存管理问题时没有任何价值。”