標籤:類設計 自身 子類 存在 調用 模組化 避免 執行順序 imp
NSData+ImageContentType 是NSData 的分類(Category)。
建立分類的步驟:
在Xcode 工程頁面,按command + N ,在iOS -> Source 選擇Objective-C File ,點擊Next ,File Type 選擇 Category ,file 框裡輸入分類名字,Calss 為要添加分類的類,可以是系統的類也可以是自訂的類,當然這裡出現的主要是系統的類。
分類的描述:
無論一個類設計的如何完美,都不可避免的會遇到沒有預測到的需求,那怎麼擴充現有的類呢?當然,繼承是個不錯的選擇。但是Objective-C 提供了一種特別的方式來擴充類,叫Catagory,可以動態為已經存在的類添加新的行為。這樣可以保證類在原來的基礎上,較小的改動就可以增加需要的功能。使用Category 對類進行擴充時,不需要訪問其原始碼,也不需要建立子類,這樣我們就可以擴充系統提供的類。Category使用簡單的方式,實現了類的相關方法的模組化,把不同的類方法分配到不同的分類檔案中。
使用Objective-C 中的分類Category,利用OC 的動態運行時分配機制,是一種編譯時間的手段,允許我們給一個已經存在的類添加方法來擴充它(但是通過category不能添加新的執行個體變數),並且我們不需要訪問原有類中的代碼就可以做到。
分類的功能作用:
- 即使在你不知道一個類的源碼的情況下,可以在不修改原來類的基礎上向這個類添加擴充方法,主要用來給系統內建的類擴充方法
- 將類的實現分散到多個不同檔案或多個不同架構中。
- 建立對私人方法的前向引用。(實現對基類中私人方法(就是沒在.h 檔案中聲明)的訪問,在基類中有一個私人方法 a(),直接存取是不行的,就需要在分類中.h 檔案中聲明一下這個方法,然後就可以調用了)
- 向對象添加非正式協議。
- 使用分類為類添加方法,通過在.h 檔案中聲明一個額外的方法並且在.m 檔案中實現方法即可。分類的名字(也就是括弧括起來的自訂字串)表示的是:對於聲明於其他地方的某個類,在此處添加的是他的額外的方法,而不是表示這是一個新的類。
- Category 只能添加“方法”,不能增加成員變數,Category 中可以訪問原來類中的成員變數,但是只能訪問@protected 和 @public 形式的變數,如果想要訪問本類中的私人變數,分類和子類一樣,只能通過方法來訪問。如果分類中聲明了一個屬性,那麼分類只會產生這個屬性的set、get方法聲明,也就是不會產生set 、get 方法的實現。(如果想添加執行個體變數,那就通過繼承建立子類來實現)
- Category可以重新定義新方法,可以重載原始類的方法,不推薦這麼做,這樣會覆蓋掉原始類的方法。如果確實要重載,那就通過繼承建立子類來實現。
類屬性修飾符延伸:
Objective-C 中,類的執行個體化變數的範圍有@private、@protected、@public。他們代表的意思和C++中相同,只是前面添加了一個@符號。下面介紹一下他們代表的範圍:
- @pribate :作用範圍只能在自身類
- @protected :作為範圍在自身類和繼承自己的子類,什麼都不寫的時候預設就是此屬性
- @public :作用範圍最大,在任何地方
分類的執行優先順序:
- 在本類和分類有相同的方法時,優先調用分類的方法再調用本類的方法。
- 如果有兩個分類,他們都實現了相同的方法,如何判斷誰先執行?分類執行順序可以通過TARGETS -> Build Phases -> Compile Sources 進行調節,注意執行順序是從上到下的。(只有兩個分類含有相同的方法名)
類擴充(class Extensions)
類擴充(Extension) 是Category 的一個特例,有時候也被稱為匿名分類。他的作用是為一個類添加一些私人的成員變數和方法。和分類不同,類擴充即可以聲明成員變數又可以聲明方法。
類擴充(Extension) 只有介面檔案(.h),沒有實現檔案(.m) 定義的方法通通在類裡邊實現。類擴充聽上去很複雜,但其實我們早就認識他了,當我們建立一個繼承自UIViewControll的子類時,在它的.m 檔案裡面會自動產生類擴充:
@interface ExtensionsViewController ()
@end
我們可以在裡面添加私人屬性和私人方法,私人方法需要在下面的@implementation 裡面實現。
當然類擴充可以定義在.m 檔案中,這種擴充方式中定義的變數都是私人的,也可以定義在.h 檔案中,這樣定義的代碼就是公有的,類擴充在.m 檔案中聲明私人方法是非常好的方式。類擴充中添加的方法,一定要實現,不然會有編譯警告。
1 #import "ExtensionsViewController.h"2 3 @interface ExtensionsViewController ()4 5 @end6 7 @implementation ExtensionsViewController8 9 ...
類擴充的作用:
- 能為某個類附加額外的屬性,成員變數,方法聲明
- 一般的類擴充寫到.m檔案中
- 一般的私人屬性寫到類擴充
使用格式:
1 #import "ViewController.h"2 3 @interface ViewController ()4 5 // 屬性6 // 方法7 8 @end
分類和類擴充的相似之處是:都可以為類添加一個額外的方法。
不同之處在於:
1 // .h 2 @interface 類名(分類名字) 3 4 /*方法聲明*/ 5 6 @end 7 8 // .m 9 @implementation類名(分類名字)10 11 /*方法實現*/12 13 @end
- 分類只能擴充方法,不能擴充屬性和成員變數(如果包含成員變數會直接報錯)。
- 再說一下我們為什麼不能包含類的.m 檔案,因為這樣會重複包含另一類的實現檔案。
參考連結:http://blog.csdn.net/jiajiayouba/article/details/21104987
http://www.jianshu.com/p/18d48e7f2aad
http://www.cnblogs.com/sgdkg/p/3142647.html
http://blog.csdn.net/kindazrael/article/details/8062784
http://www.cocoachina.com/ios/20161018/17784.html
http://www.jb51.net/article/80246.htm
http://www.2cto.com/kf/201504/387630.html
http://blog.csdn.net/qq_30513483/article/details/52068424
http://www.tuicool.com/articles/AV7fiy
SDWebImage源碼閱讀(二)NSData+ImageContentType