Objective-C 運(yùn)行時-Category的使用
Category 定義
類別是Objective-C的一項功能,可擴(kuò)展類的接口然遏,而無需對類進(jìn)行子類化。category 可以為已經(jīng)存在的類增加方法吧彪,而不需要增加一個子類待侵。而且,我們可以在不知道某個類內(nèi)部實(shí)現(xiàn)的情況下姨裸,為該類增加方法秧倾。和子類不同的是,Category不能用于向被擴(kuò)展類添加實(shí)例變量傀缩,所以Category通常作為一種組織框架代碼的工具來使用那先。如果我們想增加某個框架(framework)中的類的方法,category 就非常有效赡艰。
Category 用途
在不創(chuàng)建繼承類的情況下實(shí)現(xiàn)對已有類的擴(kuò)展售淡。
簡化類的開發(fā)工作(當(dāng)一個類需要多個程序員協(xié)同開發(fā)的時候,Category可以將同一個類根據(jù)用途分別放在不同的源文件中慷垮,從而便于程序員獨(dú)立開發(fā)相應(yīng)的方法集合)勋又。
將常用的相關(guān)的方法分組。
在沒有源代碼的情況下可以用來修復(fù)BUG换帜。
Category 局限性
主要有兩方面局限性:
- 無法向類中添加新的實(shí)例變量楔壤,類別沒有位置容納實(shí)例變量(可以通過associative來解決)。
objective-c有兩個擴(kuò)展機(jī)制:category和associative惯驼。我們可以通過category來擴(kuò)展方法蹲嚣,但是它有個很大的局限性递瑰,不能擴(kuò)展屬性。于是隙畜,就有了專門用來擴(kuò)展屬性的機(jī)制:associative抖部。
- 名稱沖突,即當(dāng)類別中的方法與原始類方法名稱沖突時议惰,類別具有更高的優(yōu)先級慎颗。類別方法將完全取代初始方法從而無法再使用初始方法。這個類似于方法的重載言询,但是這里是直接覆蓋了原方法俯萎。
Objective-C 運(yùn)行時機(jī)制
簡單定義:蘋果給開發(fā)這提供的一套在運(yùn)行時動態(tài)創(chuàng)建類、添加屬性/方法(不止這些运杭,還有一些其他功能)的API夫啊,它是一套純C語言的API,使用相應(yīng)的API就可以通過Category給一個原本存在的類添加屬性辆憔。
@[ 那應(yīng)該如何使用 Category 呢撇眯? ]
使用Category對類進(jìn)行方法的拓展網(wǎng)上太多現(xiàn)成的案例,下面演示如何進(jìn)行屬性的拓展:
.h 聲明文件
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
@interface NSObject (CategoryWithProperty)
/**
* 要在Category中擴(kuò)展的屬性
*/
@property (nonatomic, strong) NSObject *property;
@end
.m 實(shí)現(xiàn)文件
#import "NSObject+CategoryWithProperty.h"
@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