我想更多地了解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的系统。所以现在我可能会遇到一个空字符串,然后在其上设置相关的对象数据,然后有另一个空字符串并与第一个字符串冲突。
我目前通过创建可变字符串解决了我的问题。
所以我的问题:
我正在使用XCode 5.1.1,OSX 10.9.4,SDK 10.9。
谢谢!
答案 0 :(得分:2)
这是Objective-C规范还是XCode偏心?
这只是实施细节。没有记录在哪里。这些行为将来可能会发生变化,恕不另行通知。
有谁知道实例是如何确定的?为什么“x”得到一个实例,而不是“xy”?我认为会涉及到一些内部词典,并且没有充分理由停止1个字符。
直到有人能够访问源代码才能与我们分享详细信息。
有没有办法将其关闭,所以所有空字符串都是唯一的实例或其他建议?
无法将其关闭。不要将objc_setAssociatedObject
与NSString
正如@Ken Thomases在评论中所说的
通常,将objc_setAssociatedObject()与任何值类一起使用可能没有意义。
其他一些示例包括NSNumber
,NSData
和NSValue
。它们经常被缓存和重用。