2012年4月13日 星期五

飛天豬的category外掛




   小豬有沒有可能像彼得潘一樣翱翔於天際呢?
   只要發揮想像力,
   沒有什麼不可能的!
 
 
   接下來彼得潘將示範如何利用Objective-C獨門的category,
   施加魔法,
   讓Pig物件具有飛翔的能力。
   (感謝藝術家朋友Jorinde Jankowski (張友鷦)提供可愛的飛天豬)

1. 新增category


2. 設定category的名稱以及外掛作用的類別
   
    如下圖所示,
    Category填入Fly,Category on填入Pig,
    到時候category Fly將讓小豬比人類先一步長出翅膀。



    新產生的category檔案包含.h和.m
    檔名Pig+Fly其實正是外掛作用類別和category名稱的結合。




3. 定義category
    定義category的語法其實和定義類別雷同,
    只不過category名稱必須加在類別名稱後的 ( ) 裡。


 
 有一點值得注意的,
  category只能擴充原有物件的能力,
  因此其只能增添新method,
  並不能增加instance variable。
  比方Pig原本沒有hair,
  我們無法利用category讓其多了hair attribute。

4. 測試
#import "Pig+Fly.h"
Pig *pig = [[Pig alloc] init];
[pig fly];
view raw gistfile1.m hosted with ❤ by GitHub


為什麼不用繼承?



如果我們定義繼承自Pig的FlyPig類別,
不是也能實現飛天豬嗎?
category的最大好處在於它擴充的是原有物件的能力,
因此只要是Pig物件,
即可飛翔。
但如果採用繼承,
只有FlyPig可以飛翔。
尤其如果是內建的類別,
我們更可以體會category的美妙。
比方我們想讓NSString物件具有顛倒字串的能力,
此時我們只要創建作用於NSString上的Reverse category,
再定義reverseString method
即可讓所有的NSString物件皆具有顛倒是非,
哦,說錯了,
顛倒字串的能力。


Core Data的應用
我們也常利用category擴充NSManagedObject subclass的能力。
因為如果我們直接將新能力定義於NSManagedObject subclass,
每當我們修改表格欄位,
重新產生檔案時,
原來辛苦填寫的新method將消失無蹤







沒有留言:

張貼留言