为什么不要重写原有类方法

转自:http://m.blog.csdn.net/blog/Hello_Hwc/43964643

如果要重写现有类的方法,请考虑使用继承。 

------- 
前言: 
Category是一种向现有类中添加方法,而不需要继承或者改变现有类的方式。在IOS开发中,使用还是十分广发的。例如在CoreData中,用category来为NSManagedObject类添加适当方法。

FAQ: 
为什么不直接把方法放到ViewController中? 
因为,如果把这些代码都放到Controller中,会造成Controller过于臃肿,难以维护。


一 Category简介

类别可以建立在任何类的基础上,而不需要获得获得或者修改原有类的代码。类别添加的方法对于当前类和子类都可以访问。 在IOS Rumtime时候,类别的方法和原有类的方法并没有什么区别。

注意: 
类别可以添加类方法和实例方法。虽然语法上支持添加属性,但是并不适合添加额外的属性,因为无法跟踪这些额外的属性。

Category举例 
我想要为UIButton定制一个方法来获得配置自己想要的效果。

1 创建Category 
选择新建Objective C File -> Next 

选择Category,在class中键入UIButton,File中键入想要的名字,我这里是WCProgress。->Next 

会生成两个文件

UIButton+WCProgress.h 
UIButton+WCProgress.m

然后在.h文件中定义接口

#import <UIKit/UIKit.h>

@interface UIButton (WCProgress)
-(void)WC_setUpCustomButton;
;

@end

在.m文件中实现接口

@implementation UIButton (WCProgress)
(void)WC_setUpCustomButton{
    [self setTitle:@"CustomButton" forState:UIControlStateNormal];
    [self setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
    self.backgroundColor = [UIColor yellowColor];
    self.layer.cornerRadius = CGRectGetHeight(self.bounds)/2;
}
@end

这样,就可以在使用的地方如下使用

 UIButton * button = [[UIButton alloc] initWithFrame:CGRectMake(0,0,150,25)];
    [button WC_setUpCustomButton];
    [self.view addSubview:button];
    button.center = self.view.center;

效果如下 
这里写图片描述

二 为什么不要重写原有类方法

主要原因如下:

CocoaFramework有很多是用Category实现的,重写之后,会导致在Runtime的时候,只有一个方法会被执行,而哪个会被执行是undefined。

例如,重写NSString的一个方法base64EncodedString,而其他CocoaFramework的也有可能使用Category来实现这个方法,这样就会导致在Runtime的时候,执行哪个方法是Undefined。

另外,有个地方要注意,那就是Category方法的命名。 
通常的明明方式是加一个前缀,例如

-(void)WC_setUpCustomButton;

因为,现在名字并未发生冲突,IOS版本在更新,SDK也在更新,也就是说要尽量保证将来方法的名称也不发生冲突。

附上Apple 文档的相关链接

Customizing Existing Classes

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值