iOS類別(Category)與擴(kuò)展(Extension,匿名類別)

一梢夯、Category

Category在iOS開發(fā)中使用頻繁烘挫,尤其在為系統(tǒng)類進(jìn)行拓展的時(shí)候,我們可以不用繼承系統(tǒng)類雳锋,直接給系統(tǒng)類添加方法黄绩,最大程度體現(xiàn)了Objective-C的動(dòng)態(tài)語言特性。

注意事項(xiàng)

1:類別是類的擴(kuò)展玷过,只可以聲明方法爽丹,不可以聲明變量(runtime搞)。并且辛蚊,類別的方法優(yōu)先級(jí)較高粤蝎,可覆蓋原類方法。

2:類別的方法中嚼隘,不可以調(diào)用super方法诽里。--類別的局限

3:category 方法不能覆蓋于同一class 的其它 category中的方法。因?yàn)椴环A(yù)知他們的加載優(yōu)先順序飞蛹,就可能在編譯時(shí)出錯(cuò)谤狡。

使用類別:

1。對(duì)框架提供類的擴(kuò)展(沒有源碼卧檐,不能修改)墓懂。

2。 不想生成一個(gè)新的子類的情況下霉囚,比如對(duì)NSArray 的擴(kuò)展捕仔。

3。方便做項(xiàng)目管理盈罐,可以將一份源碼在多個(gè)地方共享或者做方法版本管理榜跌、多人協(xié)作開發(fā)、用本地版本替換公共版本實(shí)現(xiàn)盅粪。

#import  
@interface NSObject (Category)  
- (void)myMethod;  
@end 

使用Category需要注意的點(diǎn):
1.Category的方法不一定非要在@implementation中實(shí)現(xiàn)钓葫,也可以在其他位置實(shí)現(xiàn),但是當(dāng)調(diào)用Category的方法時(shí)票顾,依據(jù)繼承樹沒有找到該方法的實(shí)現(xiàn)础浮,程序會(huì)崩潰帆调。
2.Category理論上不能添加變量,但是可以使用@dynamic來彌補(bǔ)這種不足豆同。
??2.1 @dynamic的作用就是禁止編譯器為@property產(chǎn)生setter和getter方法番刊,有兩種辦法實(shí)現(xiàn)setter和getter方法 1.自己提供setter和getter方法;2.方法動(dòng)態(tài)決議(DynamicMethod Resolution)dynamic參考鏈接http://blog.csdn.net/daydreamingboy/article/details/22682851
??擴(kuò)展@synthesize的作用就是讓編譯器自動(dòng)生成setter和getter方法影锈,還有一個(gè)作用芹务,可以指定與屬性對(duì)應(yīng)的實(shí)例變量,例如@synthesize myButton = xxx; 那么self.myButton其實(shí)是操作的實(shí)例變量xxx精居,而不是_myButton了锄禽。
實(shí)際項(xiàng)目中有這么寫的

@synthesize myButton;

這樣寫了之后,那么編譯器會(huì)自動(dòng)生成myButton的實(shí)例變量靴姿,以及相應(yīng)的getter和setter方法沃但。注意:_myButton這個(gè)實(shí)例變量是不存在的,因?yàn)樽詣?dòng)生成的實(shí)例變量為myButton而不是_myButton佛吓,所以現(xiàn)在@synthesize的作用就相當(dāng)于指定實(shí)例變量宵晚;
如果.m文件中寫了@synthesize myButton;那么生成的實(shí)例變量就是myButton;如果沒寫@synthesize myButton;那么生成的實(shí)例變量就是_myButton

#import  
static const voidvoid * 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);  
} 

增加屬性方法
.h文件

//分類的頭文件
@interface ClassName (CategoryName)
@property (nonatomic, strong) NSString *str;
@end

.m文件

//實(shí)現(xiàn)文件
#import "ClassName + CategoryName.h"
#import <objc/runtime.h>

static void *strKey = &strKey;

@implementation ClassName (CategoryName) 
-(void)setStr:(NSString *)str  
{  
    objc_setAssociatedObject(self, & strKey, str, OBJC_ASSOCIATION_COPY);  
}  

-(NSString *)str  
{  
    return objc_getAssociatedObject(self, &strKey);  
}
@end

setStr:方法中使用了一個(gè)objc_setAssociatedObject的方法淤刃,這個(gè)方法有四個(gè)參數(shù),分別是:源對(duì)象吱型,關(guān)聯(lián)時(shí)的用來標(biāo)記是哪一個(gè)屬性的key(因?yàn)槟憧赡芤砑雍芏鄬傩裕┮菁郑P(guān)聯(lián)的對(duì)象和一個(gè)關(guān)聯(lián)策略。

用來標(biāo)記是哪一個(gè)屬性的key常見有三種寫法津滞,但代碼效果是一樣的铝侵,如下:

//利用靜態(tài)變量地址唯一不變的特性
1、static void *strKey = &strKey;

2触徐、static NSString *strKey = @"strKey"; 

3咪鲜、static char strKey;

關(guān)聯(lián)策略是個(gè)枚舉值,解釋如下:

enum {
    OBJC_ASSOCIATION_ASSIGN = 0, //關(guān)聯(lián)對(duì)象的屬性是弱引用 

    OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, //關(guān)聯(lián)對(duì)象的屬性是強(qiáng)引用并且關(guān)聯(lián)對(duì)象不使用原子性

    OBJC_ASSOCIATION_COPY_NONATOMIC = 3, //關(guān)聯(lián)對(duì)象的屬性是copy并且關(guān)聯(lián)對(duì)象不使用原子性

    OBJC_ASSOCIATION_RETAIN = 01401, //關(guān)聯(lián)對(duì)象的屬性是copy并且關(guān)聯(lián)對(duì)象使用原子性

    OBJC_ASSOCIATION_COPY = 01403 //關(guān)聯(lián)對(duì)象的屬性是copy并且關(guān)聯(lián)對(duì)象使用原子性
};

http://www.reibang.com/p/3cbab68fb856

類別幾個(gè)作用:

二鸟雏、Extension

Extension非常像是沒有命名的類別享郊,即匿名類別
作用:
1.能為某個(gè)類附加額外的屬性,成員變量孝鹊,方法聲明
2.一般的擴(kuò)展寫到.m文件中(@implementation的上方)
3.一般的私有屬性寫到類擴(kuò)展

使用格式

@interface Mitchell()
//屬性
//方法
@end

使用Extension注意的點(diǎn):
Extension中的方法必須在@implementaion中實(shí)現(xiàn)炊琉,否則編譯會(huì)報(bào)錯(cuò)。

三惶室、Category和Extension區(qū)別

區(qū)別.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末温自,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子皇钞,更是在濱河造成了極大的恐慌悼泌,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,332評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件夹界,死亡現(xiàn)場(chǎng)離奇詭異馆里,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)可柿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,508評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門鸠踪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人复斥,你說我怎么就攤上這事营密。” “怎么了目锭?”我有些...
    開封第一講書人閱讀 157,812評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵评汰,是天一觀的道長。 經(jīng)常有香客問我痢虹,道長被去,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,607評(píng)論 1 284
  • 正文 為了忘掉前任竭鞍,我火速辦了婚禮构眯,結(jié)果婚禮上岔冀,老公的妹妹穿的比我還像新娘。我一直安慰自己坯墨,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,728評(píng)論 6 386
  • 文/花漫 我一把揭開白布瓢阴。 她就那樣靜靜地躺著畅蹂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪荣恐。 梳的紋絲不亂的頭發(fā)上液斜,一...
    開封第一講書人閱讀 49,919評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音叠穆,去河邊找鬼少漆。 笑死,一個(gè)胖子當(dāng)著我的面吹牛硼被,可吹牛的內(nèi)容都是我干的示损。 我是一名探鬼主播,決...
    沈念sama閱讀 39,071評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼嚷硫,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼检访!你這毒婦竟也來了始鱼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,802評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤脆贵,失蹤者是張志新(化名)和其女友劉穎医清,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體卖氨,經(jīng)...
    沈念sama閱讀 44,256評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡会烙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,576評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了筒捺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柏腻。...
    茶點(diǎn)故事閱讀 38,712評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖系吭,靈堂內(nèi)的尸體忽然破棺而出五嫂,到底是詐尸還是另有隱情,我是刑警寧澤村斟,帶...
    沈念sama閱讀 34,389評(píng)論 4 332
  • 正文 年R本政府宣布贫导,位于F島的核電站,受9級(jí)特大地震影響蟆盹,放射性物質(zhì)發(fā)生泄漏孩灯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,032評(píng)論 3 316
  • 文/蒙蒙 一逾滥、第九天 我趴在偏房一處隱蔽的房頂上張望峰档。 院中可真熱鬧,春花似錦寨昙、人聲如沸讥巡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽欢顷。三九已至,卻和暖如春捉蚤,著一層夾襖步出監(jiān)牢的瞬間抬驴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,026評(píng)論 1 266
  • 我被黑心中介騙來泰國打工缆巧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留布持,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,473評(píng)論 2 360
  • 正文 我出身青樓陕悬,卻偏偏與公主長得像题暖,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,606評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 重點(diǎn)掌握 3 類對(duì)象和方法 對(duì)象就是一個(gè)物體 類的獨(dú)特存在就是一個(gè)實(shí)例胧卤,對(duì)實(shí)例進(jìn)行操作叫做方法唯绍。方法可以應(yīng)用于類或...
    Coder大雄閱讀 1,256評(píng)論 0 2
  • 《招聘一個(gè)靠譜的 iOS》—參考答案(上) 說明:面試題來源是微博@我就叫Sunny怎么了的這篇博文:《招聘一個(gè)靠...
    牛大發(fā)了閱讀 1,153評(píng)論 0 8
  • 電路如人生 ——由電路得到的啟示 福建信息職業(yè)技術(shù)學(xué)院 朱麗華 每次在介紹和分析《模擬電子線路》課程時(shí),都有個(gè)很...
    zhujulie閱讀 2,700評(píng)論 7 6
  • 我的父親出生于二十世紀(jì)四十年代初枝誊,中專肄業(yè)推捐,曾經(jīng)當(dāng)過兵,后來在煤礦上工作侧啼,直到退休。 那時(shí)的父親堪簿,并沒有現(xiàn)代家庭教...
    泠風(fēng)思語閱讀 316評(píng)論 0 1
  • 愛不愛你痊乾, 喜不喜歡你, 日久見人心的角逐椭更, 水落石出的美麗哪审。 似是而非的不對(duì)你有一絲關(guān)心, 那是想要掩飾我對(duì)你心...
    阿俊xi閱讀 305評(píng)論 0 2