iOS runtime注意事项(持续改进中)

2017-12-18  本文已影响7人  汝阴龙

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、可以给类添加属性、成员变量、方法、协议吗?

答案:可以,可以给一个动态添加的类添加任何一个常规类等所具有的东西。

上一篇下一篇

猜你喜欢

热点阅读