NSString长度和retainCount.需要澄清

Jam*_*sev 4 memory-management objective-c

根据以下代码,请指教

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
Run Code Online (Sandbox Code Playgroud)
  1. 最初我想知道为什么数字这么大但后来看到一个帖子解释它.试问,而不是...为什么这个号码改成我大大是否使用%dVS %lu.最初,我使用过%d,但得到一个警告,说" 转换指定类型int但参数的类型为NSUInteger(也就是unsigned long).修复是%d改为%lu"

  2. 为什么保留计数不减少?str发送后,大数字仍然显示不变release

  3. 为什么我str发送后仍能访问release

jtb*_*des 8

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

  1. 别担心.(就%d /%lu而言,那些说明符只是期望不同的数据类型,而%d(int)具有更小且不同的范围,来自%lu(无符号长))
  2. 别担心.
  3. 不要这样做,特别是不要依赖它.

这可能是因为你使用常量字符串(@"Hello world")开始,当你调用release时内存没有被释放,并且retainCount很大.但是如果你不得不关心retainCount,你就错了.

你正在正确的位置释放字符串,这才是最重要的 - 不要试图以后再使用它.