美文网首页iOS日常须知
iOS category真的不能添加property吗?

iOS category真的不能添加property吗?

作者: 不会游泳De鱼 | 来源:发表于2017-02-08 11:42 被阅读272次

    类别,网上一大堆的解释(利用Objective-C的动态运行时分配机制,可以为现有的类添加新方法,这种为现有的类添加新方法的方式称为类别catagory,他可以为任何类添加新的方法,包括那些没有源代码的类)

    第一、先看看正常的类添加property,图1是继承自UIImageView的子类ImageViewNetwork,有一个属性localImage和一个实例变量view1,build是succeeded。
    图2是localImage的setter和getter方法的最简单写法。(如果不写setter/getter方法,系统会自动生成)

    图1 UIImageViewNetwork.png 图2 ImageViewNetwork.m.png

    图3中是创建的一个UIImageView的类别,名称为Network,在给类别添加实例变量view1的时候报错了(实例变量是成员变量的一种,实例变量应该是由类定义的变量),意思是实例变量不能被放在类别中。 但是localImage是我创建的一个属性,没有报错。但是这个localImage在 .m文件中@implement UIImageView(Network)中是无法使用的,只能在@implement UIImageView里用。

    图3 UIImageView(Network).png

    为什么不能在@implement UIImageView(Network)用呢?看看下面的图片(图4), 我在.m里调用了这个方法,但是打印self.localImage的时候报错了,说"localImage"这个属性不在 UIImageView类型的对象上, 有点难理解。。但是如果把下面的setter/getter方法取消注释再跑一遍发现看看(图5)发现self.localImage = nil, 说明类别不会自动帮属性生成getter/setter方法。(localImage无法使用,说明声明属性的时候没有生成开头的成员变量)

    图4 UIImageView(Network).m.png 图5UIImageView(Network).m.png

    图6在@implement UIImageView(Network)中直接使用属性报错了,所以说添加的属性不能在@implement UIImageView(Network)中使用(图3中说明了category中不能添加实例变量,所以图6中使用属性只能使用self.localImage)

    图6.png

    总结

    category中是可以添加property的(并不是所谓的category无法添加属性property),但是category不会自动添加setter/getter,也不能使用实例变量,所以无法像图1 图2中那样实现,也就导致了在category中property的无法正常使用。

    Question :category中真的就无法使用property了吗?

    A:可以使用,用runtime是可以实现为category添加property的。

    资料借鉴链接
    1、iOS Category中添加属性和成员变量的区别
    2、ios类别(category)不能添加成员变量但是可以添加属性的问题

    相关文章

      网友评论

        本文标题:iOS category真的不能添加property吗?

        本文链接:https://www.haomeiwen.com/subject/ppyvittx.html