IOS开发:关于使用Category的陷阱

Category作为OC一个非常好用的特性、可以给已经存在的类添加新的方法。

项目中我为了给已有的一个图片展示模块增加一个右下角的“Gif”图示。于是想到了使用Category给UIImageView扩展出一个在右下角显示图示的方法,并且重写了ImageView的LayoutSubview方法,使图示始终保持在右下角。编译运行一切都正常进行。  直到我发现另一个地方的ImageView的子控件不听我操作,经过排查才发现是另一个文件中的ImageView也受了之前写的Category的影响,我才发现以下事实:

1、Category一旦定义、作用域是全局的、对当前应用的所有代码都起作用、无论你是否引用了Category的头文件。这就要求我们不要肆意使用Category、因为不知道会影响到什么意想不到的代码。

2、实现Category的时候尽量不要覆盖原有的方法、这样做有两个原因:

(1)、这样不能像子类一样调用父类的方法、并且容易引起意外(没有引入的地方也自动受这个Category影响。这样这些地方的原有方法的行为也会改变。

(2)、由于Category不能指定覆盖另一个Category中的方法。如果覆盖的是系统框架中实现的方法、内部有可能也是Category实现的、这样会产生未知的行为:到底是你覆盖了系统的、还是系统覆盖了你的。

PS:在另外一篇文章里看到说给NSObject写Category的时候要注意不能调用super、以为NSObject没有父类、关于这个我还没有测试。