? ? 最近工程中用到了類別(category)這個東西,當我在建立類別文件的時候我突然發現了個一個問題,我感覺類別跟擴展這個東西跟我之前記的不一樣了,想當初剛轉行到iOS的時候,為了應付面試,死記硬背過一些東西,類別和擴展就是其中之一。大概說一下我之前記的吧,以前記的是類別跟擴展都是用來實現對類的擴展的,在類別中不可以定義變量,擴展相當于沒有名稱的類別,區別是可以定義變量。當我在使用類別和擴展的過程中我發現,類別也可以定義變量,擴展貌似只可以定義變量。為什么這么說呢,請看下圖
通過這個圖我們可以看到,添加擴展我們只得到一個.h文件。就一個頭文件頂一個方法也沒辦法實現,那他不就是用來定義變量的嗎。其實不是的,我們可以在這個.h文件中定義方法,但是實現必須在原始類的.m中。再說變量,我們單獨在這定義個變量有什么用呢?某些情況下,我們需要聲明一個@property,它對外是只讀的(readonly),而對內是可讀寫的(readwrite),這時,可以通過Extensions實現這個可讀寫的私有變量。
? ? 總結一下,擴展只是用來定義類的私有方法的,實現要在原始的.m里面。還以用來改變原始屬性的一些性質,例如只讀變可寫。現在原始.m文件的上面都自帶擴展了。
? ? 下面來說一下類別,之前說類別不可以定義變量,也可以用@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,不能設置cgcolor。后來我在stackoverflow上找到一個方法,這個方法就是用類別的方式定義一個邊的顏色的屬性,具體看下圖
用類別的方式加上這個屬性就可以在xib中用keypath的方式實現邊的顏色設置了。如下圖:
以上就是我對類別和擴展的一些想法,有什么不對的或者大家有什么想法可以交流一下。
補充:categor是不允許添加實例變量,注意是不能添加實例變量,而不是屬性成員(具體參見類別不是應該只能添加方法嗎?類別現在能直接添加屬性了?)。因為category是運行期決定的,所以當你添加實例變量的話,那么這個類的內存空間就要變了,而類的內存空間是在編譯期就確定了。這里你可以添加屬性成員,但是得自己實現getter和setter方法。