objc的动态特性真是很好玩
cocoadev上有一篇关于替换成员方法的文章,可以将一个成员方法替换成新的实现
原文
http://www.cocoadev.com/index.pl?MethodSwizzling
这里又观察到一个现象
在写新实现的时候,调用的方法名称是新的方法名称
@implementation Foo(specialfooBar)
// returns the login name of the current user plus some other junk - (NSString *)myfooBar { return [[self myfooBar] stringByAppendingString:@", bigtime luser"]; } @end
看起来就像一个死循环的递归.
在实现替换后,这个死循环消失了.
这说明什么呢?
编译的时候,没有计算myfooBar的地址.如果是编译时绑定的,那么myfooBar将继续指向自己.一直是个死循环.
这里有个文章更详细的介绍
http://cocoasamurai.blogspot.com/2010/01/understanding-objective-c-runtime.html