OC-category 为什么不能添加成员变量
2017-08-15 18:24
363 查看
以下的答案是百度的,仅做记录而已:
1. 利用运行时实际上也不是添加成员变量。已编译的类的内存布局是不变的,Class就是一个结构体,里面的成员不能改变。但是通过运行时可以将一个对象或基础类型变成指定Class对象的一个关联对象,他们两者的内存布局是分开的,与成员变量不同。
2.关联的并不是在指定Class上,而是指定的对象上,概念上有一定差别。
objc_setAssociatedObject()这个函数接收四个参数,第一个是需要关联的对象,第二个是索引的一个KEY,第三个是被关联对象,第四个是内存管理类型。
所以这里运行时会为某个对象设一个关联键值对,通过KEY可以找到对应的关联对象。
objc_getAssociatedObject(),接收关联对象和KEY提取出被关联对象。
3.Rumtime的话是黑魔法,滥用起来的话OC会变成JS,动态能力太强,什么都可以通过运行时来改。。但同时也让维护变得非常困难,就像交换方法这种,如果故意恶作剧在一些Foundation里交换了一些常用方法。。这就坑爹了。
Runloop的话如果不涉及优化的话也不是很常用,通常是通过添加观察者响应Runloop状态的回调从而进行一些操作,例如在Runloop空闲的时候扔一些任务给他做做。
APP开发更注重是是上层与业务打交道的逻辑。到需要优化的时候再考虑用这些黑魔法去实现。
4.OC是不能直接修改对象的结构体的成员变量属性,一般做法是先取出对象的结构体变量,修改该取出来的结构体变量里面的成员,再把结构体对象赋值给原来的结构体变量;这个就要弄清@property关键字了,在类中@property关键字会生成私有成员变量,和申明getter setter方法,但是在分类中只会声明getter和setter方法,不会生成成员变量;扩展: 如果在.m中手动实现了setter和getter方法,x-code就不会自动生成@synthesize,也就不会生成成员变量;点语法访问的是getter方法,对象的->调用才是访问的成员变量
5.如果我们真的需要给category增加属性的实现,需要借助于运行时的两个函数:
1. 利用运行时实际上也不是添加成员变量。已编译的类的内存布局是不变的,Class就是一个结构体,里面的成员不能改变。但是通过运行时可以将一个对象或基础类型变成指定Class对象的一个关联对象,他们两者的内存布局是分开的,与成员变量不同。
2.关联的并不是在指定Class上,而是指定的对象上,概念上有一定差别。
objc_setAssociatedObject()这个函数接收四个参数,第一个是需要关联的对象,第二个是索引的一个KEY,第三个是被关联对象,第四个是内存管理类型。
所以这里运行时会为某个对象设一个关联键值对,通过KEY可以找到对应的关联对象。
objc_getAssociatedObject(),接收关联对象和KEY提取出被关联对象。
3.Rumtime的话是黑魔法,滥用起来的话OC会变成JS,动态能力太强,什么都可以通过运行时来改。。但同时也让维护变得非常困难,就像交换方法这种,如果故意恶作剧在一些Foundation里交换了一些常用方法。。这就坑爹了。
Runloop的话如果不涉及优化的话也不是很常用,通常是通过添加观察者响应Runloop状态的回调从而进行一些操作,例如在Runloop空闲的时候扔一些任务给他做做。
APP开发更注重是是上层与业务打交道的逻辑。到需要优化的时候再考虑用这些黑魔法去实现。
4.OC是不能直接修改对象的结构体的成员变量属性,一般做法是先取出对象的结构体变量,修改该取出来的结构体变量里面的成员,再把结构体对象赋值给原来的结构体变量;这个就要弄清@property关键字了,在类中@property关键字会生成私有成员变量,和申明getter setter方法,但是在分类中只会声明getter和setter方法,不会生成成员变量;扩展: 如果在.m中手动实现了setter和getter方法,x-code就不会自动生成@synthesize,也就不会生成成员变量;点语法访问的是getter方法,对象的->调用才是访问的成员变量
5.如果我们真的需要给category增加属性的实现,需要借助于运行时的两个函数:
objc_setAssociatedObject objc_getAssociatedObject 6.就category和extension的区别来看,我们可以推导出一个明显的事实,extension可以添加实例变量,而category是无法添加实例变量的(因为在运行期,对象的内存布局已经确定,如果添加实例变量就会破坏类的内部布局,这对编译型语言来说是灾难性的)
相关文章推荐
- ios类别(category)不能添加成员变量但是可以添加属性的问题
- iOS类别(category)不能添加成员变量但是可以添加属性的问题
- 为什么category可以添加方法不能添加变量
- VC++中不能为控件添加成员变量 深入本质
- iOS Category中添加属性和成员变量的区别
- js中为什么不能为值类型的变量动态添加属性呢?
- 59.通过 runtime为Category添加属性与成员变量
- 让Category支持添加属性与成员变量【转载】
- 让Category支持添加属性与成员变量
- VC++中不能为控件添加成员变量 深入本质
- 为什么Java中类的成员变量不能被重写?
- iOS中动态添加属性的方法——关联(e.g. 向Category添加成员变量)
- 指针对虚基类成员变量的访问为什么不能直接通过offset访问,而需要通过vbtable间接访问?
- 让Category支持添加属性与成员变量
- Category添加属性与成员变量
- 让Category支持添加属性与成员变量
- 含有string成员的结构体变量,为什么不能初始化?
- 日常笔记之一 -- 让Category支持添加属性与成员变量
- 让Category支持添加属性与成员变量【转载】
- JAVA成员变量为什么不能在类体中先定义后赋值