类别,网上一大堆的解释(利用Objective-C的动态运行时分配机制,可以为现有的类添加新方法,这种为现有的类添加新方法的方式称为类别catagory,他可以为任何类添加新的方法,包括那些没有源代码的类)
第一、先看看正常的类添加property,图1是继承自UIImageView的子类ImageViewNetwork,有一个属性localImage和一个实例变量view1,build是succeeded。
图2是localImage的setter和getter方法的最简单写法。(如果不写setter/getter方法,系统会自动生成)
图3中是创建的一个UIImageView的类别,名称为Network,在给类别添加实例变量view1的时候报错了(实例变量是成员变量的一种,实例变量应该是由类定义的变量),意思是实例变量不能被放在类别中。 但是localImage是我创建的一个属性,没有报错。但是这个localImage在 .m文件中@implement UIImageView(Network)
中是无法使用的,只能在@implement UIImageView
里用。
为什么不能在@implement UIImageView(Network)
用呢?看看下面的图片(图4), 我在.m里调用了这个方法,但是打印self.localImage的时候报错了,说"localImage"这个属性不在 UIImageView类型的对象上, 有点难理解。。但是如果把下面的setter/getter方法取消注释再跑一遍发现看看(图5)发现self.localImage = nil, 说明类别不会自动帮属性生成getter/setter方法。(localImage无法使用,说明声明属性的时候没有生成开头的成员变量)
图6在@implement UIImageView(Network)
中直接使用属性报错了,所以说添加的属性不能在@implement UIImageView(Network)
中使用(图3中说明了category中不能添加实例变量,所以图6中使用属性只能使用self.localImage)
总结
category中是可以添加property的(并不是所谓的category无法添加属性property),但是category不会自动添加setter/getter,也不能使用实例变量,所以无法像图1 图2中那样实现,也就导致了在category中property的无法正常使用。
Question :category中真的就无法使用property了吗?
A:可以使用,用runtime是可以实现为category添加property的。
资料借鉴链接
1、iOS Category中添加属性和成员变量的区别
2、ios类别(category)不能添加成员变量但是可以添加属性的问题