Objective c 如何识别可变对象?
在我的应用程序中,在某个时刻,我需要识别可变对象以适当地处理它们。事实证明,这比看起来要困难得多 如果在Objective c 如何识别可变对象?,objective-c,cocoa,immutability,introspection,Objective C,Cocoa,Immutability,Introspection,在我的应用程序中,在某个时刻,我需要识别可变对象以适当地处理它们。事实证明,这比看起来要困难得多 如果在NSString上使用iskindof类:[NSMutableString类],则所有字符串似乎都是可变的 如果我问他们是否响应@selector(appendString:),他们都会响应 如果我真的尝试在一个@try..@catch..@finally块中对它们进行变异,真相就会被揭示出来。然而,这是非常不雅和非常缓慢 最好的做法是什么?如果您想忽略易变性,可以迭代循环,并使用-mutab
NSString
上使用iskindof类:[NSMutableString类]
,则所有字符串似乎都是可变的
如果我问他们是否响应@selector(appendString:)
,他们都会响应
如果我真的尝试在一个@try
..@catch
..@finally
块中对它们进行变异,真相就会被揭示出来。然而,这是非常不雅和非常缓慢
最好的做法是什么?如果您想忽略易变性,可以迭代循环,并使用
-mutableCopy
创建每个字符串的易变副本(无论如何,它都会创建NSMutableStrings)。反之亦然:通过向每个对象发送-copy
,可以保证获得一个不可变的NSString。不幸的是,由于NSString是一个类集群,所以可变性不是一个干净的可测试概念。检查带有@“\uu NSCFString”
行的类是非常不安全的,因为苹果有权随时更改基础类。您已经尝试使用isMemberOfClass[[NSMutableString]]
?您是否试图确定该类实际上是NSMutableString
?如果是这样,您是否尝试过使用isMemberOfClass:
方法,如果它实际上是类的成员(但不是子类),则返回YES
?并查看始终有趣的BNR博客:“…它非常不雅且非常慢”。。。理论上(基于继承)mutableString是kindof类:[NSString类]
应该为true,但nonMutableString是kindof类:[NSMutableString类]
应该为false。(但Objective-C遗传偶尔表现出一定程度的近亲繁殖。)