ios - 如何在 Objective-C 中确定相同的 NSString?

标签 ios objective-c nsstring nsnotificationcenter

考虑以下代码:

+ (NSString *)helloString
{
    return @"hello";
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSString *a = [AppDelegate helloString];
    NSString *b = [AppDelegate helloString];
    NSLog(@"%@", a == b ? @"yes" : @"no");
    abort();
}

在我的机器上,结果总是"is"。这是否意味着 NSString 字面值 @"hello" 在 Objective-C 运行时总是相同的“对象”?

其实我的初衷是在NSNotificationpostNotificationName:object:方法中使用一个唯一可识别的对象绑定(bind)。我计划使用 NSString 文字作为对象。这样做安全/推荐吗?

最佳答案

从历史上看,NSString 文字在一个翻译单元内保证是唯一的,并且在实践中甚至在翻译单元之间也经常是唯一的。据我所知,当前文档不再提出此声明,Clang 文档建议不要依赖它。

如果您想要一个保证始终是同一个对象的字符串,您可以简单地将一个字符串分配给一个全局常量。所有对该常量的引用将肯定产生相同的对象。

不过,关于 NSNotification,我不会使用这样的字符串作为对象。 NSNotification 的语义表明对象参数应该是触发通知的对象——它在概念上“来自”。与通知相关的其他信息在用户信息字典中更有意义。

关于ios - 如何在 Objective-C 中确定相同的 NSString?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24920406/

相关文章:

ios - 如何使用自动布局滑动内容

ios - 在 Objective C 中不使用 switch 语句显示评级图像的最佳实践

objective-c - NSString writeToFile 带有 URL 编码字符串

ios - 打开 UIViewController,不显示 UINavigationController 导航栏

ios - UITableView cellForRowAt 在 numberOfRowsInSection 之前

ios - 没有获得 ARKit 中相机位置的 session `didUpdate`

ios - Xcode-ld : library not found for -lPods

objective-c - XCode 文档 - 离线阅读

c++ - xcode 使用需要 './configure' ,'make' 和 'make install' 的外部库构建项目

objective-c - 有没有办法使用 NSString stringByFoldingWithOptions 将单个法语字符 'œ' 展开为 'oe' ?