類別,網(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)會自動生成)
圖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
里用。
為什么不能在@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í)候沒有生成開頭的成員變量)
圖6在@implement UIImageView(Network)
中直接使用屬性報(bào)錯(cuò)了,所以說添加的屬性不能在@implement UIImageView(Network)
中使用(圖3中說明了category中不能添加實(shí)例變量,所以圖6中使用屬性只能使用self.localImage)
總結(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)不能添加成員變量但是可以添加屬性的問題