用于空或1字符串的NSString的唯一实例

时间:2014-07-14 22:58:10

标签: objective-c

我想更多地了解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的系统。所以现在我可能会遇到一个空字符串,然后在其上设置相关的对象数据,然后有另一个空字符串并与第一个字符串冲突。

我目前通过创建可变字符串解决了我的问题。

所以我的问题:

  1. 这是Objective-C规范,还是XCode偏心?
  2. 有谁知道实例是如何确定的?为什么“x”得到一个实例,而不是“xy”?我认为会涉及到一些内部词典,并且没有充分的理由停止1个字符。
  3. 有没有办法将其关闭,所以所有空字符串都是唯一的实例或其他建议?
  4. 我正在使用XCode 5.1.1,OSX 10.9.4,SDK 10.9。

    谢谢!

1 个答案:

答案 0 :(得分:2)

  

这是Objective-C规范还是XCode偏心?

这只是实施细节。没有记录在哪里。这些行为将来可能会发生变化,恕不另行通知。

  

有谁知道实例是如何确定的?为什么“x”得到一个实例,而不是“xy”?我认为会涉及到一些内部词典,并且没有充分理由停止1个字符。

直到有人能够访问源代码才能与我们分享详细信息。

  

有没有办法将其关闭,所以所有空字符串都是唯一的实例或其他建议?

无法将其关闭。不要将objc_setAssociatedObjectNSString

一起使用

正如@Ken Thomases在评论中所说的

  

通常,将objc_setAssociatedObject()与任何值类一起使用可能没有意义。

其他一些示例包括NSNumberNSDataNSValue。它们经常被缓存和重用。