基于以下代码,请指教

NSString *str= [[NSString alloc] initWithString:@"Hello world"];

NSLog(@"Length: %lu\n", [str length]);              // 11
NSLog(@"Retain count is %lu\n", [str retainCount]); //1152921504606846975

[str release];

NSLog(@"%lu\n", [str length]);                      // 11
NSLog(@"Retain count is %lu\n", [str retainCount]); //1152921504606846975
  • 最初我想知道为什么这个数字如此之大,但后来看到了一个 post explaining it 。让我问这个吧……为什么这个数字无论我使用 %d 还是 %lu 都会发生很大的变化。最初,我使用 %d ,但收到警告说“转换指定类型为 int 但参数的类型为 NSUInteger(又名 unsigned long)。解决方法是将 %d 更改为 %lu
  • 为什么保留计数不减少?发送 str release
  • 后,仍然显示大数不变
  • 为什么在发送 str 后我仍然可以访问 release
  • 最佳答案

    这可能是一个难以接受的答案,但这是您应该做的:

  • 别担心。 (就 %d/%lu 而言,那些说明符只是期望不同的数据类型,而 %d (int) 与 %lu (unsigned long) 的范围要小得多且不同)
  • 别担心。
  • 不要这样做,尤其不要依赖它。

  • 这可能是因为您从一个常量字符串 ( @"Hello world" ) 开始,当您调用 release 时内存没有被释放,并且 retainCount 很大。但是如果你必须关心retainCount,你就错了。

    您在正确的位置释放字符串,这很重要 - 以后不要尝试使用它。

    10-08 01:35