IOS Category不要重写原有类方法

原创Blog,转载请注明出处

blog.csdn.net/hello_hwc

总结出来一句话

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

-------

前言:

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

时间: 2024-11-08 00:41:31

IOS Category不要重写原有类方法的相关文章

category中重写方法?

问:可以在category中重写方法吗? 答:代码上可以实现 在category中重写方法,但在实际开发中,不建议这样做.如果确实需要重写原有方法也建议使用子类进行重写. category是为了更方便的去拓展一个类,而不是去重写一个类. 理由: 1.category中重写了A类中的某个方法,那么A类中的原始方法 将永远不会被执行.特殊:load.initialize.viewDidLoad等方法 会先执行A类中的原始方法,再执行category中的方法. 2.多个category中有相同的方法

iOS Category实现原理 (补充)

iOS Category实现原理 (补充) load 和 initialize load load方法会在程序启动就会调用,当装载类信息的时候就会调用. 调用顺序看一下源代码.在 objc-loadmethod.m 文件中实现 void call_load_methods(void) { static bool loading = NO; bool more_categories; loadMethodLock.assertLocked(); // Re-entrant calls do not

c#隐藏和重写基类方法的区别

c#隐藏和重写基类方法的区别 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace interfaceInfo { public class animal { public void action() { Console.WriteLine("eat sleep fuck"); } public virtual void show() { Conso

IOS开发中重写init方法使用需谨慎

IOS开发中重写init方法使用需谨慎 今天在写一个小软件的时候出现一点问题,这个软件的功能是搜索全国学校,首页就是搜索输入框,在框中输入完要查询的学校所在省份,点击buttom后就会跳转到对应的视图控制器中,然后把搜索结果呈现在一个TableView上,但是我在调试时,每次输入完然后点击搜索按钮时,弹出结果列表总是空的,我需要返回到首页再点击一次搜索才会出现结果,而且我在首页更改搜索关键字之后,点击搜索,结果还是上次的搜索结果,必须返回点击一次才会出现这次的搜索结果. 经过大神指点,原来这个问

ios category类别的使用

ios category类别的使用 Objective-C提供了一个非常灵活的类(Class)扩展机制-类别(Category).类别用于对一个已经存在的类添加方法(Methods).你只需要知道这个类的公开接口,不需要知道类的源代码.需要注意的是,类别不能为已存在的类添加实例变量(Instance Variables). 类别的基本语法如下: @interface ClassName(CategoryName)//method declarations@end@interface 类名(类别名

iOS Category详解

此文章对类别分析的很透彻,虽然有些地方可能重复说着类别的作用和优缺点,不过没关系,,看的多了,,我们都记着了,,我觉得这样更好,继续学习,加油! 类别 类别是一种为现有的类添加新方法的方式. 利用Objective-C的动态运行时分配机制,可以为现有的类添加新方法,这种为现有的类添加新方法的方式称为类别catagory,他可以为任何类添加新的方法,包括那些没有源代码的类. 类别使得无需创建对象类的子类就能完成同样的工作 一.创建类别 1.声明类别 声明类别与声明类的形式很相似 @interfac

iOS Category与Extension、Delegate的认识

Catrgory与Extension.Delegate的区别与用法 苹果的官方文档 Category在iOS开发中使用非常频繁.尤其是在为系统类进行拓展的时候,我们可以不用继承系统类,直接给系统类添加方法,最大程度的体现了Objective-C的动态语言特性. #import @interface NSObject (Category) - (void)myMethod; @end 这是一个最简单的Category,作用于NSObject类,给NSObject添加了一个方法. 使用Categor

iOS Category 和 Protocol 中的 Property 你们真的会了么?

一.property 合成存取器: @property的格式: 1 @property (修饰列表) 变量类型 变量名; Xcode4.4之前: @property使编译器自定生成set/get方法声明. @synthesize自动生成set/get方法的实现 @synthesize还会自动生成私有成员变量 Xcode4.4以后: 不用再写@synthesize,编译器通过@property就能给我们生成set/get方法的声明和实现,默认生成成员变量:_propertyName 用@prope

ios category,protocol理解

category: 向现有的类中增加方法,同时提供方法的实现,现有类不需要做任何改动. protocol:(相当于Java或C#中的接口interface,当很多类都要需要类似的方法,但是方法具体实现因类的不同而不同的时候,需要用到protocol或interface,C++中不需要interface是因为C++支持多重继承,实现类似功能只需要各个类继承同一个基类即可) 现有的类如果要实现protocol就需要实现其中的方法,方法实现在现有的类中,现有类需要做改动.