category和associative是objective-c的兩個(gè)擴(kuò)展機(jī)制求类。
1.category(添加自定義方法)
#import “UIImageViewCategory.h”
@interface UIImageView(UIImageViewCategory)
-(void)extMethod矗晃;
@end
#import “UIImageViewCategory.h”
@implementation UIImageView(UIImageViewCategory)
-(void)extMethod {
.....
}
@end
2.associative(添加自定義屬性)
associative是一種發(fā)生在運(yùn)行時(shí)的對(duì)象關(guān)聯(lián)機(jī)制(引入objc/runtime.h),將一個(gè)對(duì)象關(guān)聯(lián)到另一對(duì)象鸵贬,通過一個(gè)關(guān)鍵字建立關(guān)聯(lián)脖捻,這個(gè)關(guān)鍵詞必須是唯一的,一般采用靜態(tài)字符串變量才作為關(guān)鍵字嗜浮。
associative機(jī)制共有3個(gè)方法摩疑,設(shè)置關(guān)聯(lián)對(duì)象、獲取關(guān)聯(lián)對(duì)象吉殃、刪除關(guān)聯(lián):
/*
*源對(duì)象
*關(guān)鍵字:靜態(tài)變量,可使用static const *NSString 或 staticchar
*關(guān)聯(lián)的對(duì)象
*關(guān)聯(lián)策略:assign蛋勺,retain鸠删,copy等協(xié)議
*/
OBJC_EXPORTvoid objc_setAssociatedObject(id object,constvoid *key,id value,objc_AssociationPolicy policy)
OBJC_EXPORTid objc_getAssociatedObject(id object,constvoid *key)
//Removes all associations for a given object.
OBJC_EXPORTvoid objc_removeAssociatedObjects(id object)
#import<UIKit/UIKit.h>
@interface UIImageView (UIImageViewbtnImage)
@property (nonatomic, strong) UIImageView *btnImageView;
@end
#import"UIImageViewbtnImage.h"
#import <objc/runtime.h>
static char kbtnImageView;
@implementation UIImageView (UIImageViewbtnImage)
// get
-(UIImageView *)btnImageView
{
// return objc_getAssociatedObject(self, @selector(isClicked));
return objc_getAssociatedObject(self, &kbtnImageView);
}
// set
-(void)setBtnImageView:(UIImageView *)btnImageView
{
//如果是指針類型
return objc_setAssociatedObject(self, &kbtnImageView, btnImageView, OBJC_ASSOCIATION_RETAIN);
//1 源對(duì)象self
//2 關(guān)鍵字 唯一靜態(tài)變量key isClicked
//3 關(guān)聯(lián)的對(duì)象
//4 關(guān)鍵策略 OBJC_ASSOCIATION_RETAIN_NONATOMIC
//objc_setAssociatedObject(self, @selector(isClicked), @(isClicked), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end
Category的局限性
主要有兩方面局限性:
(1)無(wú)法向類中添加新的實(shí)例變量刃泡,類別沒有位置容納實(shí)例變量〖衣簦可以通過associative來(lái)解決
(2)名稱沖突庙楚,即當(dāng)類別中的方法與原始類方法名稱沖突時(shí),類別具有更高的優(yōu)先級(jí)酪捡。類別方法將完全取代初始方法從而無(wú)法再使用初始方法逛薇。這個(gè)類似于方法的重載疏虫,但是這里是直接覆蓋了原方法
類別的作用
類別主要有3個(gè)作用:
(1)可以將類的實(shí)現(xiàn)分散到多個(gè)不同文件或多個(gè)不同框架中啤呼,方便代碼管理官扣。也可以對(duì)框架提供類的擴(kuò)展(因?yàn)榭蚣茴悰]有源碼羞福,不能修改)。
(2)創(chuàng)建對(duì)私有方法的前向引用:如果其他類中的方法未實(shí)現(xiàn)卖陵,在你訪問其他類的私有方法時(shí)編譯器報(bào)錯(cuò)這時(shí)使用類別张峰,在類別中聲明這些方法(不必提供方法實(shí)現(xiàn)),編譯器就不會(huì)再產(chǎn)生警告
(3)向?qū)ο筇砑臃钦絽f(xié)議:創(chuàng)建一個(gè)NSObject的類別稱為“創(chuàng)建一個(gè)非正式協(xié)議”鸥滨,因?yàn)榭梢宰鳛槿魏晤惖奈袑?duì)象使用谤祖。