iOS開發(fā)之 Category用法和Extension的區(qū)別

iOS中category即:類別 棒动;extension 為擴張

一.category

類別是一種為現(xiàn)有的類添加新方法的方式。

利用Objective-C的動態(tài)運行時分配機制酝碳,Category提供了一種比繼承(inheritance)更為簡潔的方法來對class進行擴展遂跟,無需創(chuàng)建對象類的子類就能為現(xiàn)有的類添加新方法蓬推,可以為任何已經(jīng)存在的class添加方法,包括那些沒有源代碼的類(如某些框架類)俺抽。

1.類別的局限:(1)無法向類別中添加新的實例變量敞映,類別沒有位置容納實例變量。如果一定要添加實例變量凌埂,可以采用runtime 庫objc_setAssociatedObject / objc_getAssociatedObject 函數(shù)來解決驱显。objc_setAssociatedObject 就是將一個對象跟另一個對象進行關(guān)聯(lián),并用一個key來標示瞳抓,objc_getAssociatedObject 就是用這個key來拿到與receiver相關(guān)聯(lián)的一個對象埃疫。

注意:必須使用@dynamic來讓編譯器知道我們自己實現(xiàn)setter/getter方法(如果對于@dynamic有疑問,請參見:http://stackoverflow.com/questions/1160498/synthesize-vs-dynamic-what-are-the-differences)

不能使用@synthesize(也不能@dynamic 和@synthesize都不寫孩哑,什么都不寫在最新的xcode里是默認@synthesize)栓霜,@synthesize會自動生成成員變量,并自動生成setter/getter方法横蜒。

最后胳蛮,objc_setAssociatedObject 的關(guān)聯(lián)的policy 可以根據(jù)自己的需求使用,這個例子使用 OBJC_ASSOCIATION_RETAIN_NONATOMIC來標示一個strong reference來指向被關(guān)聯(lián)的對象丛晌。

(2)名稱沖突仅炊,即當類別中的方法名與原始類中的名稱相同的時候,類別具有更高的優(yōu)先級澎蛛。類別的方法將完全取代原始方法而無法再使用原始方法抚垄。

2.類別的作用

類別的作用主要有三個:

(1)可以將類的實現(xiàn)分散到多個不同的文件或者不同的框架中,方便代碼的管理。也可以對框架提供類的擴展(沒有源碼呆馁,不能修改)桐经。

(2)創(chuàng)建對私有方法的前向引用:如果其他類中的方法未實現(xiàn),在你訪問其他類的私有方法時編譯器報錯這時使用類別浙滤,在類別中聲明這些方法(不必提供方法實現(xiàn))阴挣,編譯器就不會再產(chǎn)生警告

(3)向?qū)ο筇砑臃钦絽f(xié)議:創(chuàng)建一個NSObject的類別稱為“創(chuàng)建一個非正式協(xié)議”,因為可以作為任何類的委托對象使用纺腊。

二.Extension 的使用

首先還是需要創(chuàng)建相關(guān)類的擴展畔咧,即方法的聲明,然后在需要擴張的類中引入頭文件揖膜,然后實現(xiàn)聲明的方法盒卸。

三.Category 與Extension 的區(qū)別

1.形式上看:extension 是匿名的category

2.extension中聲明的方法需要在mainimplementation中實現(xiàn),而category 不做強制要求

3.extension 可以添加屬性次氨、成員變量蔽介,而category 一般不可以。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末煮寡,一起剝皮案震驚了整個濱河市虹蓄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌幸撕,老刑警劉巖薇组,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異坐儿,居然都是意外死亡律胀,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門貌矿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來炭菌,“玉大人,你說我怎么就攤上這事逛漫『诘停” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵酌毡,是天一觀的道長克握。 經(jīng)常有香客問我,道長枷踏,這世上最難降的妖魔是什么菩暗? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮旭蠕,結(jié)果婚禮上停团,老公的妹妹穿的比我還像新娘婴梧。我一直安慰自己,他們只是感情好客蹋,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著孽江,像睡著了一般讶坯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上岗屏,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天辆琅,我揣著相機與錄音,去河邊找鬼这刷。 笑死婉烟,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的暇屋。 我是一名探鬼主播似袁,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼咐刨!你這毒婦竟也來了昙衅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤定鸟,失蹤者是張志新(化名)和其女友劉穎而涉,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體联予,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡啼县,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了沸久。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片季眷。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖卷胯,靈堂內(nèi)的尸體忽然破棺而出瘟裸,到底是詐尸還是另有隱情,我是刑警寧澤诵竭,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布话告,位于F島的核電站,受9級特大地震影響卵慰,放射性物質(zhì)發(fā)生泄漏沙郭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一裳朋、第九天 我趴在偏房一處隱蔽的房頂上張望病线。 院中可真熱鬧,春花似錦、人聲如沸送挑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惕耕。三九已至纺裁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間司澎,已是汗流浹背欺缘。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留挤安,地道東北人谚殊。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像蛤铜,于是被迫代替她去往敵國和親嫩絮。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

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

  • 5围肥、糖尿残跫恰: 糖尿病是吃出來的病,吃的太多虐先,不活動怨愤,加上胰島素功能下降,有些是遺傳的蛹批。糖尿病表現(xiàn)為多飲撰洗、多...
    越努力越幸運_20d2閱讀 118評論 0 0
  • 作者\方知 過客匆匆,一別就是永遠腐芍。 時隔幾年差导,關(guān)于那段記憶已有些模糊,然有些個事情又似乎就在昨日猪勇。 那是一段要命...
    醉是人間幾時休閱讀 493評論 0 5