最近發(fā)現(xiàn)面試題總是會(huì)出現(xiàn)說(shuō)下Category和Extension的區(qū)別
之前學(xué)習(xí)的時(shí)候總是分不清 檀头,隨著自己寫(xiě)的代碼看的代碼多了钥平,規(guī)律也變的清楚了贞远,借此在Xcode8上大致寫(xiě)下蛋褥。
1.1categories
一 彼宠、分類(lèi)(categories)能夠向一個(gè)已有的類(lèi)中添加方法可很。拓展(extensions)能夠在當(dāng)前類(lèi)中增加屬性和方法诗力。
二、類(lèi)別的局限性
有兩方面局限性:
(1)無(wú)法向類(lèi)中添加新的實(shí)例變量我抠,類(lèi)別沒(méi)有位置容納實(shí)例變量苇本。
(2)名稱(chēng)沖突袜茧,即當(dāng)類(lèi)別中的方法與原始類(lèi)方法名稱(chēng)沖突時(shí),類(lèi)別具有更高的優(yōu)先級(jí)瓣窄。類(lèi)別方法將完全取代初始方法從而無(wú)法再使用初始方法笛厦。
三、類(lèi)別的作用
類(lèi)別主要有3個(gè)作用:
(1)可以將類(lèi)的實(shí)現(xiàn)分散到多個(gè)不同文件或多個(gè)不同框架中康栈,方便代碼管理递递。也可以對(duì)框架提供類(lèi)的擴(kuò)展(沒(méi)有源碼,不能修改)啥么。
(2)創(chuàng)建對(duì)私有方法的前向引用:如果其他類(lèi)中的方法未實(shí)現(xiàn)登舞,在你訪(fǎng)問(wèn)其他類(lèi)的私有方法時(shí)編譯器報(bào)錯(cuò)這時(shí)使用類(lèi)別,在類(lèi)別中聲明這些方法(不必提供方法實(shí)現(xiàn))悬荣,編譯器就不會(huì)再產(chǎn)生警告
(3)向?qū)ο筇砑臃钦絽f(xié)議:創(chuàng)建一個(gè)NSObject的類(lèi)別稱(chēng)為“創(chuàng)建一個(gè)非正式協(xié)議”菠秒,因?yàn)榭梢宰鳛槿魏晤?lèi)的委托對(duì)象使用。
1.新建項(xiàng)目Categories和Extensions ? ? command+n 選擇Ojective—C File?
2.填寫(xiě)類(lèi)目名 選擇Category ??
Categories可以為一個(gè)對(duì)象添加方法而不需要增加該類(lèi)的子類(lèi)或者更改當(dāng)前的對(duì)象氯迂。實(shí)際上Categories通常被用來(lái)為已經(jīng)存在的類(lèi)添加方法践叠,比如你可以自己為 NSString 字符串類(lèi)添加你自己的方法。
3.
2.1 類(lèi)擴(kuò)展(Extension)簡(jiǎn)介
類(lèi)擴(kuò)展是分類(lèi)的一個(gè)特例嚼蚀。
Extension是Category的一個(gè)特例禁灼。
起名字為匿名,并且添加的方法一定要實(shí)現(xiàn)轿曙。(category可以不實(shí)現(xiàn))弄捕。因此又叫匿名分類(lèi)〉嫉郏可以為一個(gè)類(lèi)添加額外的變量守谓,方法或者合成屬性。
我的理解:
延展就是為類(lèi)一開(kāi)始設(shè)計(jì)沒(méi)有考慮到的情況增加新的屬性方法來(lái)彌補(bǔ)您单。延展的實(shí)現(xiàn)如下:
2.0.1創(chuàng)建 ? ? ?command+n ? Objective-C ? ?填寫(xiě)延展名Strong 選擇
2.0.2 ?在Person_Strong ?里面可以定義屬性和 方法?
他們的主要區(qū)別是:
1斋荞、形式上來(lái)看,extension是匿名的category虐秦。
2平酿、extension里聲明的方法需要在mainimplementation中實(shí)現(xiàn),category不強(qiáng)制要求悦陋。
3染服、extension可以添加屬性(變量),category不可以叨恨。
頂