标签( ios Category)
一、category重写系统类的方法
在做xcode7中状态栏显示为白色的时候,以前的在plist文件中设置不好用了,于是查了一个办法,写个UINavigationController的扩展
#import "UINavigationController+Status.h"
@implementation UINavigationController (Status)
-(UIStatusBarStyle)preferredStatusBarStyle
{
return UIStatusBarStyleDefault;
}
@end
但是遇到了一个问题,没有导入头文件就能起作用,在查完api文档之后,发现在预编译时已经编译,系统会自动调用。于是自己写了一个NSString的扩展,但发现并没有调用。原因是程序启动的时候必定调用UINavigationController,所以有效果,而NSString这个必须显式的调用。
之后发现的问题:
- CocoaFramework有很多是用Category实现的,重写之后,会导致在Runtime的时候,只有一个方法会被执行,而哪个会被执行是undefined。
例如,重写NSString的一个方法base64EncodedString,而其他CocoaFramework的也有可能使用Category来实现这个方法,这样就会导致在Runtime的时候,执行哪个方法是Undefined。
- 另外,有个地方要注意,那就是Category方法的命名。 通常的明明方式是加一个前缀。因为这也可能和系统重名。
因为,现在名字并未发生冲突,IOS版本在更新,SDK也在更新,也就是说要尽量保证将来方法的名称也不发生冲突。
总结:
- 需要重写方法的时候,尽量使用继承。不要使用category
- category的名字尽量加前缀,防止和系统冲突
- 不忘初心,记住category最初的作用