
父类Person
1.动态的创建一个类,用到了下面这个方法:
为这个新创建的类添加方法和成员变量,并且注册这个类。
2.添加成员变量
返回YES,添加成功,返回NO,添加失败,说明该类中已经存在这个名称。它的调用是在 objc_allocateClassPair 之后, objc_registerClassPair 之前,给一个存在的类添加实例变量是不允许的。
我们尝试着给Person添加address
3.添加方法
通过 class_addMethod(Class cls, SEL name, IMP imp, const char *types) 方法添加,参数依次为:添加方法的类,方法名,方法实现,方法参数的描述。
通过这个方法会重写父类的实现,需要改变本类方法实现,通过方法 method_setImplementation .
打印结果:
4.重写本类中的方法
通过方法 method_setImplementation(Method m, IMP imp) 返回类型 IMP ,方法m之前的实现.
打印结果:
在调用study的方法的时候打印的是play的结果,调换了方法的实现。 method_exchangeImplementations(Method m1, Method m2) ,可能也是通过这种方法实现m1,m2的交换。
5.添加属性
打印结果
1. 分类是可以通过关联对象的方式,间接的添加了成员变量。但实际上类但成员列表里面无该成员变量信息。
2. 表现上分析,分类底层的结构体无成员变量的字段。
3. 根本原因: 如果分类能添加成员变量,类对象objc_class的class_rw_t李的ro属性含有instanceSize,这样instanceSize的大小会变化。而分类的添加在运行时执行,这样会改变对象的内存结构。
同样也是classwizard,有个“控件成员变量”的勾,去掉后就是添加成员变量了。
如果学过c++直接去头文件里面手工改也可以,注意同时要修改cpp文件中的构造函数赋初值。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)