【问题标题】:How to identify mutable objects? [duplicate]如何识别可变对象? [复制]
【发布时间】:2013-03-11 19:36:18
【问题描述】:

在我的应用程序中,有时我需要识别可变对象以适当地处理它们。事实证明这比看起来更困难。

如果我在NSString 上使用isKindOfClass:[NSMutableString class],所有字符串似乎都是可变的。

如果我问他们是否回复@selector(appendString:),他们都会回复。

如果我真的尝试在 @try...@catch...@finally 块中对它们进行变异,那么真相就会大白于天下。然而,它非常不优雅而且非常缓慢。

最好的做法是什么?

【问题讨论】:

  • 您已经尝试过使用isMemberOfClass[[NSMutableString class]]
  • 您是否要确定该类是否实际上是NSMutableString?如果是这样,您是否尝试过改用 isMemberOfClass: 方法,如果它实际上是该类的成员(但不是子类),则返回 YES
  • 看看总是有趣的 BNR 博客:About Mutability
  • "...非常不雅而且很慢"...而且很破。
  • 理论上(基于继承)mutableString isKindOfClass:[NSString class] 应该为真,但nonMutableString isKindOfClass:[NSMutableString class] 应该为假。 (但 Objective-C 继承偶尔会表现出一定程度的近亲繁殖。)

标签: objective-c cocoa immutability introspection


【解决方案1】:

如果您想忽略可变性,您可以遍历循环并使用-mutableCopy 制作每个字符串的可变副本(无论如何,它都会创建 NSMutableStrings)。反之亦然:通过向每个对象发送-copy,您可以保证获得一个不可变的 NSString。不幸的是,由于 NSString 是一个类集群,可变性不是一个完全可测试的概念。使用 @"__NSCFString" 行检查类是非常不安全的,因为 Apple 有权随时更改底层类。

【讨论】:

    猜你喜欢
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多