很多人可能會問 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,這樣的好處是可閱讀性強,可以在文件一開始的幾行就告知了哪些是私有方法。
這正好解釋了,為什么大神會說擴展其實無處不在了。
理解的淺薄,如有不對,歡迎留言。。