【发布时间】:2014-07-14 22:58:10
【问题描述】:
我想了解更多关于 XCode/Objective-C 处理常量字符串的方式。我找到了related question,但我想了解更多信息。考虑以下代码:
NSString *a = [[NSString alloc] initWithUTF8String:[[_textFieldA stringValue] UTF8String]];
NSString *b = [[NSString alloc] initWithUTF8String:[[_textFieldB stringValue] UTF8String]];
NSString *c = [a copy];
NSString *d = [a mutableCopy];
请注意,textFields 只是一种在运行时设置字符串的方法,以确保编译器不会对我太聪明并在单个实例中构建。
如果我的文本字段为空,或者包含单个字符,例如“x”或“$”,则 a == b == c == 相同的常量 NSString 实例。如果我改为提供“xy”,那么 a == c != b。 d 总是唯一的,正如人们所预料的那样,因为它是可变的。
现在通常这不是问题,我不会尝试修改这些字符串的内容,但是,我正在使用经常使用 objc_setAssociatedObject 的系统。所以现在我可能会遇到一个空字符串,然后在上面设置关联的对象数据,然后有另一个空字符串并与第一个碰撞。
目前,我通过创建可变字符串解决了我的问题。
所以我的问题:
- 这是 Objective-C 规范,还是 XCode 偏心?
- 有人知道实例是如何确定的吗?为什么“x”是一个实例,而不是“xy”?我认为这涉及到一些内部字典,没有充分的理由停在 1 个字符上。
- 有没有办法关闭它,所以所有空字符串都是唯一的实例,或者其他建议?
我正在使用 XCode 5.1.1、OSX 10.9.4、SDK 10.9。
谢谢!
【问题讨论】:
-
NSString 是一个类簇。它隐藏了很多复杂性。
-
Mike Ash 写了一些关于这个的文章。 Google 标记了指针和 Objective-C。与此同时,不要担心。根据需要使用 isEqual: 和 isEqualTo: 方法。您通常不需要与 Objective-C 对象进行指针比较。
标签: objective-c