iOS runtime注意事项(持续改进中)
1、分清类和对象:
对象:类的实例。instance。
类:也是对象,元类的对象:metaClass’s instance。
2、分清实例方法和类方法。
3、看看method在哪里?是从类里面获取,还是从元类里面获取。
4、方法交换,分清被交换的方法是类方法还是实例方法。
5、私有方法:就是开头带下划线的方法:_XXXX。不可以被交换。
6、方法被多次swizzle后,调用的到底是哪个方法?建议要分清。
7、如果原来的类中没有一个方法,xxx。那么如果你使用了这种操作,
class_addMethod(origC, @selector(xxx), method_getImplementation(newMethod), method_getTypeEncoding(newMethod))
按常规,下面还应该有一个操作,class_replaceMethod,事实上,不需要的,因为此时已经可以了。
打印一下看看,类的方法列表中已经有xxx这个方法存在了。
在其他地方,是可以通过下面这种方法调用的:
SEL currentSel = @selector(xxx);
[self performSelector:currentSel];
而且和下面的操作调用的是同一个方法:newMethod
SEL newSel = @selector(newXXX);
[self performSelector:newSel];
8、动态增加类的问题。
9、class_getInstanceMethod和class_getClassMethod
class_getClassMethod得到类的类方法
class_getInstanceMethod得到类的实例方法
10、可以给类添加属性、成员变量、方法、协议吗?
答案:可以,可以给一个动态添加的类添加任何一个常规类等所具有的东西。