当我测试方法“retainCount”时,我遇到了一个问题,如下所示:
NSString *s_afmt0 = [[NSString alloc] initWithFormat:@""]; //-1
NSString *s_afmt1 = [[NSString alloc] initWithFormat:@"123"]; //1
NSLog(@"s_afmt0:%d", [s_afmt0 retainCount]);
NSLog(@"s_afmt1:%d", [s_afmt1 retainCount]);
结果: s_autf0:-1 s_autf1:1 我不知道为什么?为什么s_afmt0的retainCount是-1,s_autf1的retainCount是1,@""和@"123"有什么区别?谁能解释一下?谢谢
最佳答案
您将 retainCount 打印为有符号整数,而实际上它是无符号整数(类型 NSUInteger
,格式说明符为 %u
,而不是 %d
). -1 相当于UINT_MAX
,表示对象没有retainCount。很可能 NSString 已经认识到给定的字符串是不可变的,并将指针分配给静态 @""空 NSString,而不是将其放在堆上。
其实你可以用下面的代码来确认这一点:
NSString* str1 = [[NSString alloc] initWithFormat:@""];
NSString* str2 = [[NSString alloc] initWithFormat:@""];
NSLog(@"string1: %p, string2: %p", str1, str2);
上面的代码应该为 str1 和 str2 打印相同的指针地址,证实了我的理论,即 NSString 优化了这个特殊情况,而且确实如此:
06:46:30.142 StringTest[45214:303] string1: 0x7fff7d8acf90, string2: 0x7fff7d8acf90
那么让我们看看这是否是 NSString 特有的。应该是,否则所有初始化为空字符串的 NSMutableString 对象将指向同一内存!
NSMutableString* str1 = [[NSMutableString alloc] initWithFormat:@""];
NSMutableString* str2 = [[NSMutableString alloc] initWithFormat:@""];
NSLog(@"string1: %p, string2: %p", str1, str2);
输出:
06:53:36.688 StringTest[45278:303] string1: 0x10010a850, string2: 0x10010a890
两个不同的内存位置。所以你有它,在 Foundation 框架中进行了一个巧妙的小优化。直到
编辑:
作为 bbum points out ,你永远不应该依赖 retainCount,这是一个如果你这样做可能会出错的例子
关于objective-c - @""和 @"123"之间有什么不同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13150939/