iOS-我對類別(category)和擴(kuò)展(extension)的一點想法

? ? 最近工程中用到了類別(category)這個東西,當(dāng)我在建立類別文件的時候我突然發(fā)現(xiàn)了個一個問題,我感覺類別跟擴(kuò)展這個東西跟我之前記的不一樣了,想當(dāng)初剛轉(zhuǎn)行到iOS的時候,為了應(yīng)付面試,死記硬背過一些東西,類別和擴(kuò)展就是其中之一。大概說一下我之前記的吧,以前記的是類別跟擴(kuò)展都是用來實現(xiàn)對類的擴(kuò)展的,在類別中不可以定義變量,擴(kuò)展相當(dāng)于沒有名稱的類別,區(qū)別是可以定義變量。當(dāng)我在使用類別和擴(kuò)展的過程中我發(fā)現(xiàn),類別也可以定義變量,擴(kuò)展貌似只可以定義變量。為什么這么說呢,請看下圖

添加擴(kuò)展生成的文件

通過這個圖我們可以看到,添加擴(kuò)展我們只得到一個.h文件。就一個頭文件頂一個方法也沒辦法實現(xiàn),那他不就是用來定義變量的嗎。其實不是的,我們可以在這個.h文件中定義方法,但是實現(xiàn)必須在原始類的.m中。再說變量,我們單獨(dú)在這定義個變量有什么用呢?某些情況下,我們需要聲明一個@property,它對外是只讀的(readonly),而對內(nèi)是可讀寫的(readwrite),這時,可以通過Extensions實現(xiàn)這個可讀寫的私有變量。

? ? 總結(jié)一下,擴(kuò)展只是用來定義類的私有方法的,實現(xiàn)要在原始的.m里面。還以用來改變原始屬性的一些性質(zhì),例如只讀變可寫?,F(xiàn)在原始.m文件的上面都自帶擴(kuò)展了。

? ? 下面來說一下類別,之前說類別不可以定義變量,也可以用@dynamic的方式來定義變量,如下所示,@dynamic這種方式我沒有驗證過,不清楚能不能成功,或者是否有什么副作用。

@dynamic variable;

-?(id)?variable

{

return objc_getAssociatedObject(self,?externVariableKey);

}

-?(void)setVariable:(id)?variable

{

objc_setAssociatedObject(self,?externVariableKey,?variable,?OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}

只到有一次我想在xib上用key path的方式定義一個view的邊的顏色,在xib上用key path的方式去定義邊的顏色是不行的,原因就是xib上只能是uicolor,不能設(shè)置cgcolor。后來我在stackoverflow上找到一個方法,這個方法就是用類別的方式定義一個邊的顏色的屬性,具體看下圖


用類別的方式加上這個屬性就可以在xib中用keypath的方式實現(xiàn)邊的顏色設(shè)置了。如下圖:


以上就是我對類別和擴(kuò)展的一些想法,有什么不對的或者大家有什么想法可以交流一下。


補(bǔ)充:categor是不允許添加實例變量,注意是不能添加實例變量,而不是屬性成員(具體參見類別不是應(yīng)該只能添加方法嗎?類別現(xiàn)在能直接添加屬性了?。因為category是運(yùn)行期決定的,所以當(dāng)你添加實例變量的話,那么這個類的內(nèi)存空間就要變了,而類的內(nèi)存空間是在編譯期就確定了。這里你可以添加屬性成員,但是得自己實現(xiàn)getter和setter方法。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • 水兒身著一套奇怪的輕裝在奔跑,纖手握緊拳頭美眸目視前方均勻向前奔跑,而她奔跑在一條古色古香的長廊。 長廊的木頭全是...
    294cfe96d700閱讀 368評論 0 2
  • 我特別渴望幸福。 也許這樣說并不準(zhǔn)確,因為每一個生命都很渴望幸福。 我眼中的幸福有股淡淡的恬靜,好像是家鄉(xiāng)雨后泥土...
    我為大寶帶鹽閱讀 300評論 0 0