类别(Category)与扩展(Extension)
2016-12-19 21:28
288 查看
一、类别(又叫分类):类别的小括号中必须有名字
作用:主要是即使在你不知道一个类的源码情况下,向这个类添加扩展的方法。同时候我们也可以不用继承系统类,直接给系统类添加方法,最大程度的体现了Objective-C的动态语言特性。
使用格式:
例如:这是一个最简单的Category,作用于NSObject类,给NSObject添加了一个方法。
使用Category需要注意:
(1) Category的方法不一定非要在@implementation中实现,也可以在其他位置实现,但是当调用Category的方法时,依据继承树没有找到该方法的实现,程序则会崩溃。
(2) Category理论上不能添加变量,但是可以使用@dynamic 来弥补这种不足。 (即运行时Runtime)
(3)不可以调用super方法。–类别的局限
(4)类别的方法优先级较高,可覆盖原类方法。
category使用 objc_setAssociatedObject/objc_getAssociatedObject 实现添加属性
二、类扩展 (Extension也有人称为匿名分类)
作用:能为某个类附加额外的属性,成员变量,方法声明;
一般的类扩展写到.m文件中;一般的私有属性写到类扩展
使用格式:
例
使用Extension需要注意:
Extension中的方法必须在@implementation中实现,否则编译会报错。
作用:主要是即使在你不知道一个类的源码情况下,向这个类添加扩展的方法。同时候我们也可以不用继承系统类,直接给系统类添加方法,最大程度的体现了Objective-C的动态语言特性。
使用格式:
@interface 类名(**分类名字**) /*方法声明*/ @end @implementation类名(分类名字) /*方法实现*/ @end
例如:这是一个最简单的Category,作用于NSObject类,给NSObject添加了一个方法。
#import @interface NSObject (Category) - (void)myMethod; @end
使用Category需要注意:
(1) Category的方法不一定非要在@implementation中实现,也可以在其他位置实现,但是当调用Category的方法时,依据继承树没有找到该方法的实现,程序则会崩溃。
(2) Category理论上不能添加变量,但是可以使用@dynamic 来弥补这种不足。 (即运行时Runtime)
(3)不可以调用super方法。–类别的局限
(4)类别的方法优先级较高,可覆盖原类方法。
category使用 objc_setAssociatedObject/objc_getAssociatedObject 实现添加属性
//例1 @interface NSObject (CategoryWithProperty) @property (nonatomic, strong) NSObject *property; @end @implementation NSObject (CategoryWithProperty) - (NSObject *)property { return objc_getAssociatedObject(self, @selector(property)); } - (void)setProperty:(NSObject *)value { objc_setAssociatedObject(self, @selector(property), value, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } @end
//例2 #import static const void * externVariableKey=&externVariableKey; @implementation NSObject (Category) @dynamic variable; - (id) variable { return objc_getAssociatedObject(self, externVariableKey); } - (void)setVariable:(id) variable { objc_setAssociatedObject(self, externVariableKey, variable, OBJC_ASSOCIATION_RETAIN_NONATOMIC); }
二、类扩展 (Extension也有人称为匿名分类)
作用:能为某个类附加额外的属性,成员变量,方法声明;
一般的类扩展写到.m文件中;一般的私有属性写到类扩展
使用格式:
@interface Mitchell() //属性 //方法 @end
例
@interface MyClass : NSObject @property (retain, readonly) float value; @end //一般的时候,Extension都是放在.m文件中@implementation的上方。 @interface MyClass () @property (retain, readwrite) float value; @end
使用Extension需要注意:
Extension中的方法必须在@implementation中实现,否则编译会报错。
相关文章推荐
- iOS类别(Category)与扩展(Extension)
- Objective-C 类别(category)和扩展(Extension)
- iOS类别(Category)与扩展(Extension)
- ios的类别(category)和扩展(Extension)
- iOS类别(Category)与扩展(Extension)
- iOS类别(Category)和扩展(Extension)
- 灵活运用IOS类别(Category)和扩展(Extension)
- 类别(Category)和类扩展(Extension)
- IOSCategory类别和Extension扩展
- Objective-C----Category 类别、Extension 扩展 专题总结
- iOS类别(Category)与扩展(Extension)
- Objective-C 类别(category)和扩展(Extension)
- 类别(Category)与扩展(Extension)的区分
- iOS类别(Category)与扩展(Extension)
- iOS类别(Category)与扩展(Extension)
- iOS类别和扩展(category和extension)
- Category(类别)和扩展(Extension)的区别
- iOS类别(Category)与扩展(Extension)
- Objective-C类别(category)和扩展(Extension)的基本概念
- Category和Extension 类别与类扩展