关于Category的看法

标签( 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也在更新,也就是说要尽量保证将来方法的名称也不发生冲突。

总结:

  1. 需要重写方法的时候,尽量使用继承。不要使用category
  2. category的名字尽量加前缀,防止和系统冲突
  3. 不忘初心,记住category最初的作用

你可能感兴趣的:(关于Category的看法)