【问题标题】:Weird behaviour with retainCountretainCount 的奇怪行为
【发布时间】:2011-07-06 13:09:19
【问题描述】:

当我使用 NSArrayNSString 对象记录保留计数时,我的行为不平衡。 请看下面的代码,

NSArray *aryTemp = [NSArray arrayWithObjects:@"One",nil];
NSLog(@"Retain Count :%d",[aryTemp retainCount]);

NSArray *aryTemp2 = [[NSArray alloc] initWithObjects:@"One",nil];
NSLog(@"Retain Count :%d",[aryTemp2 retainCount]);

NSString *strTemp = @"One";
NSLog(@"Retain Count :%d",[strTemp retainCount]);

NSString *strTemp2 = [[NSString alloc] initWithString:@"One"];
NSLog(@"Retain Count :%d",[strTemp2 retainCount]);

这是我得到的输出

2011-03-01 19:19:32.410 Test[14607:207] Retain Count :37
2011-03-01 19:19:32.412 Test[14607:207] Retain Count :1
2011-03-01 19:19:32.413 Test[14607:207] Retain Count :2147483647
2011-03-01 19:19:32.413 Test[14607:207] Retain Count :2147483647

代码有什么问题??

谢谢

普拉提克·哥斯瓦米

【问题讨论】:

    标签: iphone objective-c retaincount


    【解决方案1】:

    retainCount 返回 NSUInteger,你应该以这种方式打印它...

    NSLog( @"%lu", (unsigned long)[blabla retainCount] );
    

    %d 用于有符号的 32 位整数 (int)。 NSUInteger 在 32 位平台上定义为 unsigned int,在 64 位平台上定义为 unsigned long。上面的例子对于两个 32/64 位平台都是安全的。

    【讨论】:

      【解决方案2】:

      2147483647 没问题

      2147483647 是 INT_MAX。 INT_MAX 是字符串文字的保留计数(即代码中定义的 @"foo" 字符串)。这意味着他们永远不会被释放。

      顺便说一句,不要使用retainCount。

      【讨论】:

      • 我想支持这一点:retainCount 的使用不是一个好主意,因为它是一个实现细节,尤其是单例和静态对象将为您提供保留计数的任意值(尽管大多数时候它只是 INT_MAX)。
      • 好的,但是为什么我的 NSArray 有垃圾值?我得到保留计数 - 37。为什么会这样?
      • 你怎么知道37是垃圾值?这正是您不应该使用 retainCount 的原因。
      【解决方案3】:

      你永远不应该使用-retainCount,因为它永远不会告诉你任何有用的东西。 Foundation 和 AppKit/UIKit 框架的实现是不透明的;您不知道要保留什么、为什么要保留、谁在保留、何时保留等等。

      另请参阅:StackOverflow | when to use retainCount,详细了解您为什么不使用 retainCount。

      并回应戴夫·德隆: 请大家去http://bugreport.apple.com 并要求-retainCount 被弃用。要求的人越多越好。

      【讨论】:

        【解决方案4】:

        代码有什么问题??

        您正在调用 retainCount。

        retainCount 对调试几乎毫无用处,永远不应该在生产代码中使用。对象的保留计数是一个内部实现细节,通常具有难以理解的值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-08
          • 2015-07-20
          • 2010-10-03
          • 2021-07-12
          • 2013-10-04
          • 2019-01-23
          相关资源
          最近更新 更多