objective-c - @""和 @"123"之间有什么不同吗?

标签 objective-c ios

当我测试方法“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/

相关文章:

objective-c - MPMoviePlayerController 生成本地视频文件的缩略图并存储

ios - 如何访问 JSON 数据并将其显示在 XCode Logcat 中,如果响应为空,我想显示警报

ios - 位置服务在 iOS10 中无法与 UIWebView 一起使用

ios - 由于 FirebaseSimpleLogin 已弃用,myRef authUser 返回 "simplelogin:userid"

ios - 如何反转内置图标

ios - 应用程序退出后 NSUserDefaults 不保存

objective-c - IOS上的鱼眼效果

objective-c - iOS - 跨 Storyboard使用的 NIB View (用于设计和动画逻辑)

iphone - XCode 4,错误和警告

objective-c - CocoaPods: "Generating support files"耗时太长,无论如何要改进?