SDWebImage源碼閱讀(二)NSData+ImageContentType

來源:互聯網
上載者:User

標籤:類設計   自身   子類   存在   調用   模組化   避免   執行順序   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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.