關於iOS 類擴展Extension的進一步理解


很多人可能會問  iOS的分類和擴展的區別,網上很多的講解,但是一般都是分類講的多,而這也是我們平常比較常用的知識;但是,對於擴展,總覺得理解的朦朦朧朧,不夠透徹。

這里就講一下我自己的理解,但是這個理解也是集合了前輩的經驗來的,只不過我用大白文再延伸一點。

 

對於類擴展,先看下面的概念:

能為某個類附加額外的屬性,成員變量,方法聲明
一般的類擴展寫到.m文件中
一般的私有屬性寫到類擴展

使用格式:

@interface Mitchell()
//屬性
//方法
@end

與分類的區別:

分類的小括號中必須有名字

@interface 類名(分類名字)
/*方法聲明*/
@end
@implementation類名(分類名字)
/*方法實現*/
@end
分類只能擴充方法,不能擴展屬性和成員變量(如果包含成員變量會直接報錯,runtime實現除外)。
如果分類中聲明了一個屬性,那么分類只會生成這個屬性的set、get方法聲明,也就是不會有實現(不會生成成員變量)。

 

那么,如何創建一個擴展呢:

通過New File  -> Objective-C extension來創建,比如我選擇ASStudent類,延展名叫hello,那么會自動創建一個.h文件叫ASStudent_hello.h,

沒有.m文件,因為可以直接在類的.m里寫即可。(這個也正是和分類的不同,分類會有.h 和 .m)

其實,對於只有.h文件這點,有些人可能就比較疑惑,只有一個頭文件,怎么和分類不一樣?

這正是擴展的不一樣,它只會創建一個頭文件,我們在里面可以添加成員變量、屬性、方法等;如果要實現,只需要在它要擴展的類  .m文件去實現即可。

其實可以理解成原有類多了一個.h文件,但寫在這個頭文件里面的屬性、方法等,都是私有的,只能被這個類所擁有訪問。

 

到這里,大家有沒有覺得和一種場景很熟悉?

 

對了,就是  .m文件里的定義屬性,有時我們不會在.h里寫屬性,因為那樣會變成public,只要import后,外部都可以訪問。

如果我們只想當前類用一下,只需要寫在.m里面,這樣的屬性或方法其實也是擴展的一種特殊情況啦。。。

 

摘自網上的一段話:

a:我們可以不通過創建文件來創建延展,可以直接在.m文件里寫@interface和@implementation,

注意這兩個都要寫在.m文件里,因為如果把@interface寫在.h里,那么里面的方法都是public的;
b:此外,我們也可以直接省略@interface,直接在.m文件里寫方法即可,但還是建議書寫@interface,這樣的好處是可閱讀性強,可以在文件一開始的幾行就告知了哪些是私有方法。

這正好解釋了,為什么大神會說擴展其實無處不在了。

 

理解的淺薄,如有不對,歡迎留言。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM