设为首页 加入收藏

TOP

Objective-C的方法替换(二)
2014-11-23 23:18:15 来源: 作者: 【 】 浏览:2
Tags:Objective-C 方法 替换
多少让人有些思维扭曲的感觉。我下面要介绍一个更为简洁,也更容易理解和实现的方式。
这种方式不再需要保存旧有的方法,也不必动态的区分[self override_drawRect: r] 。我们从头实现。
相对于将原有的方法存放于一个新的方法中,这里使用一个全局指针来保存:
void (*gOrigDrawRect)(id,SEL, NSRect);
然后在+load 里赋值:
+ (void)load
{
Method origMethod = class_getInstanceMethod(self,@selector(drawRect:));
gOrigDrawRect = (void*)method_getImplementation(origMethod);
(我喜欢把它转换为 void *,因为比那些又长又奇怪的函数指针好输入多了。)
然后像前面介绍的那样用新的实现替换掉就可以了。因为class_replaceMethod本身会尝试调用class_addMethod和method_setImplementation,所以直接调用class_replaceMethod就可以了。
实现如下:
Method origMethod =class_getInstanceMethod(self, @selector(drawRect:));
gOrigDrawRect = (void *)class_replaceMethod(self,@selector(drawRect:), (IMP)OverrideDrawRect,method_getTypeEncoding(origMethod))
最后实现复写方法。和之前不同的是,这里是一个方法,而不是方法:
staticvoidOverrideDrawRect(NSView*self,SEL _cmd, NSRect r)
{
gOrigDrawRect(self,_cmd, r);
[[NSColor blueColor]set];
NSRectFill(r);
}
当然,这个方法不是那么优雅,不过我认为它更易于运用。
温馨提示(The Obligatory Warning)
复写不是你自家的类是危险的! 尽量避免这么做,要不然就尽最大的可能细心处理。
首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇POJ 2488 A Knight's Journey 下一篇Objective-C中Extension与Categor..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: