如何识别可变对象?

时间:2013-03-11 19:36:19

标签: objective-c cocoa immutability introspection

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

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

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

如果我真的试图在@try ... @catch ... @finally区块中改变它们,那么事实就会揭晓。然而它非常不优雅且非常慢。

什么是最好的行动方案?

1 个答案:

答案 0 :(得分:2)

如果您想忽略可变性,可以遍历循环并使用-mutableCopy创建每个字符串的可变副本(无论如何,创建NSMutableStrings)。相反的情况是:通过向每个对象发送-copy,您可以保证获得不可变的NSString。遗憾的是,由于NSString是一个类集群,因此可变性不是一个干净的可测试概念。检查具有@"__NSCFString"行的班级令人厌恶不安全,因为Apple有权随时更改基础班级。