NSObject上的类别 - 保持安全

时间:2011-07-14 13:08:08

标签: iphone objective-c ios categories nsobject

Apple有this to say

根类的类别

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

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

2 个答案:

答案 0 :(得分:9)

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

对类别的性能影响微乎其微。我不担心这方面。

答案 1 :(得分:1)

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