NSObject类别 – 保持安全

苹果有这样的说法 :

根类的分类

一个类别可以向任何类添加方法,包括根类。 添加到NSObject的方法可用于链接到您的代码的所有类。 用类别向根类中添加方法有时可能是有用的,但也可能是相当危险的。 虽然这个类别所做的修改看起来似乎很好理解而且影响有限,但inheritance给它们的范围很广。 您可能会对您的应用程序中看不见的类进行意外更改; 你可能不知道你在做什么的所有后果。 而且,其他工作在你的应用程序上,不知道你的变化,不会明白他们在做什么。

我的问题是,如果我select的方法名称足够怪异,我确信没有其他人会使用它们(无论是在苹果公司还是在我的项目中),我是否仍然会陷入困境? 难道还会有意外的行为吗? 性能影响?

如果你真的确信苹果不会添加这个名字的方法,那么它是安全的。 如果你想强制执行这个确定性,请在select器名称的前面加上前缀。 例如,Adium在一个点上添加了一个-setObject:atIndex:方法到NSMutableArray (是的,只是现有的API方法-replaceObject:atIndex一个“装饰”包装,非常没有意义)…它原来有相同的名称作为一种内部方法,而且要求略有不同的语义。 这导致崩溃,但只在某些操作系统上。 如果它被命名为像-AISetObject:atIndex:它会没事的。

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

如果您的方法名称与任何内容不冲突,并且使用它们的人员知道他们所做的事情,则不应该遇到任何问题。 请记住,一个类别添加额外的方法,但不是实例variables的类。 一个子类更灵活,被视为一个完整的对象,它响应所有的超类方法加上它自己的方法。 除非你不能或者不方便,否则我会说做一个子类。 毕竟,分类被使用了。 我有框架时通常使用类别,我需要将私有方法添加到公开声明的类中。