iOS Category里为什么不能直接添加实例变量?

首先,要搞清楚三个概念:

1.属性。Property

2.实例变量。Ivar(属性是给成员变量默认添加了setter和getter方法。tips:如果不用@dynamic修饰的话。)

3.isa指针。在Objective-C中,任何类的定义都是对象。类和类的实例(对象)没有任何本质上的区别。任何对象都有isa指针。但是分类没有。

Category可以动态添加属性,但是不能添加实例变量。

原因:分类没有自己的isa指针.“类最开始生成了很多基本属性,比如IvarList,MethodList。分类只会将自己的method attach到主类,并不会影响到主类的IvarList。这就是为什么分类里面不能增加成员变量的原因”,实例变量没有setter和getter方法。也没有自己的isa指针。所以,就算系统不报错也不能用。

runtime给Category动态添加属性

从下图可以看到。分类添加成员变量报错。添加属性不报错,但是会有警告。并且告诉我们要的去添加setter和getter方法或者用@dynamic修饰。(注意:用@dynamic修饰只是告诉属性setter和getter必须要自己声明。只能解出警告。不能解决问题。运行时会崩溃)





解决警告方法:


1.@dynamic修饰。(注意:用@dynamic修饰只是告诉属性setter和getter必须要自己声明。只能解出警告。不能解决问题。运行时会崩溃)

2.runtime给Category动态添加属性



结果:分类中的属性可用



©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容