NSObject上的类别 - 保持安全

Wil*_*sch 10 iphone objective-c categories nsobject ios

Apple有这样说:

根类的类别

类可以向任何类添加方法,包括根类.添加到NSObject的方法可用于链接到您的代码的所有类.使用类别向根类添加方法有时很有用,但它也可能非常危险.虽然看起来类别所做的修改很容易理解并且影响有限,但继承给它们提供了广泛的范围.您可能会对应用程序中看不见的类进行意外更改; 你可能不知道你正在做的所有后果.此外,在您的应用程序上工作的其他人,如果不了解您的更改,将无法理解他们正在做什么.

我的问题是 - 如果我选择的方法名称非常奇怪,我很确定没有其他人会使用它们(无论是在Apple还是在我的项目中),我还能遇到麻烦吗?还会出现意想不到的行为吗?性能影响?

Cat*_*Man 9

如果你真的很确定Apple永远不会添加这个名字的方法,那么它是安全的.如果您想强制确定,请在选择器名称前加上前缀.例如,Adium在某一点上添加了一个-setObject:atIndex:方法NSMutableArray(是的,仅仅是现有API方法的"整形"包装器-replaceObject:atIndex.非常无意义)......它结果与内部方法具有相同的名称,而且语义略有不同.这导致崩溃,但仅限于某些操作系统.如果它被命名为类似-AISetObject:atIndex:它会没事的.

对类别的性能影响很小.我不担心这方面.

  • 这不仅仅是系统.类别方法中的一个崩溃报告` - [NSDictionary setDoubleValue:forKey:]`结果与输入管理器发生冲突,该管理器实现了一个具有相同名称的方法,但显然期望一个对象为Double:参数.输入管理器被用来向iChat注入代码,但显然已经将完整的黑客加载到每个应用程序中,包括其基础类别. (3认同)