【问题标题】:Unique Instances of NSString for empty or 1-char strings空字符串或 1 字符字符串的唯一 NSString 实例
【发布时间】: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 的系统。所以现在我可能会遇到一个空字符串,然后在上面设置关联的对象数据,然后有另一个空字符串并与第一个碰撞。

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

所以我的问题:

  1. 这是 Objective-C 规范,还是 XCode 偏心?
  2. 有人知道实例是如何确定的吗?为什么“x”是一个实例,而不是“xy”?我认为这涉及到一些内部字典,没有充分的理由停在 1 个字符上。
  3. 有没有办法关闭它,所以所有空字符串都是唯一的实例,或者其他建议?

我正在使用 XCode 5.1.1、OSX 10.9.4、SDK 10.9。

谢谢!

【问题讨论】:

  • NSString 是一个类簇。它隐藏了很多复杂性。
  • Mike Ash 写了一些关于这个的文章。 Google 标记了指针和 Objective-C。与此同时,不要担心。根据需要使用 isEqual: 和 isEqualTo: 方法。您通常不需要与 Objective-C 对象进行指针比较。

标签: objective-c


【解决方案1】:

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

这只是实现细节。没有记录在任何地方。此类行为将来可能会更改,恕不另行通知。

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

在能够访问源代码的人想要与我们分享详细信息之前,不会。

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

没有办法关闭它。不要将objc_setAssociatedObjectNSString 一起使用


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

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

其他一些例子是NSNumberNSDataNSValue。它们通常被缓存和重复使用。

【讨论】:

  • 一般来说,将objc_setAssociatedObject() 与任何值类一起使用可能没有意义。对于一个值类,一个实例的“身份”并不重要,重要的是它的值(也就是内容)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多