如果有如下一个类
#import <Foundation/Foundation.h> @interface Person : NSObject @property int age; @end @implementation Person @end
category可以在不修改Person类的代码,不用子类继承的方式扩展其方法
(实际等同于将一个类拆分在不同的文件中)
建立如下的category文件
#import "Person.m" @interface Person (yangys) - (void)study; @end @implementation Person (yangys) - (void)study { NSLog(@"%d",self.age); } @end
此文件的文件名为Person+yangys.m
则相当于Person类拥有了-(void)study方法
在main函数中调用如下:
#import <Foundation/Foundation.h> #import "Person.m" #import "Person+yangys.m" int main(int argc, const char * argv[]) { @autoreleasepool { Person *p = [Person new]; p.age = 10; [p study]; } return 0; }
结果:
注意:
1.category方法实现中可以访问原类中声明的成员变量;
2.category可以重新实现原类中的方法,但是会覆盖掉原类的方法,会导致原类的方法无法再使用;
3.调用优先级:category-> 原类-> 父类
4.如果多个category中拥有同样的方法,则最后编译的category中的方法有效。
编译顺序在Xcode中的这个位置修改:
原文:http://www.cnblogs.com/yoran-yang/p/4290936.html