iOS category真的不能添加property嗎?

類別,網(wǎng)上一大堆的解釋(利用Objective-C的動態(tài)運(yùn)行時(shí)分配機(jī)制,可以為現(xiàn)有的類添加新方法,這種為現(xiàn)有的類添加新方法的方式稱為類別catagory,他可以為任何類添加新的方法,包括那些沒有源代碼的類)

第一、先看看正常的類添加property,圖1是繼承自UIImageView的子類ImageViewNetwork,有一個(gè)屬性localImage和一個(gè)實(shí)例變量view1,build是succeeded。
圖2是localImage的setter和getter方法的最簡單寫法。(如果不寫setter/getter方法,系統(tǒng)會自動生成)

圖1 UIImageViewNetwork.png
圖2 ImageViewNetwork.m.png

圖3中是創(chuàng)建的一個(gè)UIImageView的類別,名稱為Network,在給類別添加實(shí)例變量view1的時(shí)候報(bào)錯(cuò)了(實(shí)例變量是成員變量的一種,實(shí)例變量應(yīng)該是由類定義的變量),意思是實(shí)例變量不能被放在類別中。 但是localImage是我創(chuàng)建的一個(gè)屬性,沒有報(bào)錯(cuò)。但是這個(gè)localImage在 .m文件中@implement UIImageView(Network)中是無法使用的,只能在@implement UIImageView里用。

圖3 UIImageView(Network).png

為什么不能在@implement UIImageView(Network)用呢?看看下面的圖片(圖4), 我在.m里調(diào)用了這個(gè)方法,但是打印self.localImage的時(shí)候報(bào)錯(cuò)了,說"localImage"這個(gè)屬性不在 UIImageView類型的對象上, 有點(diǎn)難理解。。但是如果把下面的setter/getter方法取消注釋再跑一遍發(fā)現(xiàn)看看(圖5)發(fā)現(xiàn)self.localImage = nil, 說明類別不會自動幫屬性生成getter/setter方法。(localImage無法使用,說明聲明屬性的時(shí)候沒有生成開頭的成員變量)

圖4 UIImageView(Network).m.png

圖5UIImageView(Network).m.png

圖6在@implement UIImageView(Network)中直接使用屬性報(bào)錯(cuò)了,所以說添加的屬性不能在@implement UIImageView(Network)中使用(圖3中說明了category中不能添加實(shí)例變量,所以圖6中使用屬性只能使用self.localImage)

圖6.png

總結(jié)

category中是可以添加property的(并不是所謂的category無法添加屬性property),但是category不會自動添加setter/getter,也不能使用實(shí)例變量,所以無法像圖1 圖2中那樣實(shí)現(xiàn),也就導(dǎo)致了在category中property的無法正常使用。

Question :category中真的就無法使用property了嗎?

A:可以使用,用runtime是可以實(shí)現(xiàn)為category添加property的。

資料借鑒鏈接
1、iOS Category中添加屬性和成員變量的區(qū)別
2、ios類別(category)不能添加成員變量但是可以添加屬性的問題

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容