如何对 initXXXX 这系列方法进行 methods swizzling?

2015-04-07 16:09:04 +08:00
 thuai

一般写initWithFrame:如下

- (id)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame]) {
        // do something ...
    }
    return self;
}

在网上看到经常有人进行这样的method swizzling,代码如下:

- (id)swizzled_initWithFrame:(CGRect)frame
{
    // This is the confusing part (article explains this line).
    id result = [self swizzled_initWithFrame:frame];

    // Safe guard: do we have an UIView (or something that has a layer)?
    if ([result respondsToSelector:@selector(layer)]) {
        // Get layer for this view.
        CALayer *layer = [result layer];
        // Set border on layer.
        layer.borderWidth = 2;
        layer.borderColor = [[UIColor redColor] CGColor];
    }

    // Return the modified view.
    return result;
}


+ (void)load
{
    Method original, swizzle;

    // Get the "- (id)initWithFrame:" method.
    original = class_getInstanceMethod(self, @selector(initWithFrame:));

    // Get the "- (id)swizzled_initWithFrame:" method.
    swizzle = class_getInstanceMethod(self, @selector(swizzled_initWithFrame:));

    // Swap their implementations.
    method_exchangeImplementations(original, swizzle);
}

想问下,swizzled_initWithFrame:这个方法中并没有发送[super initWithFrame]这个消息,那如何保证super initWithFrame了呢?

v2ex上大神多,请轻喷!谢谢:)

2694 次点击
所在节点    iOS
5 条回复
ambitiouspei
2015-04-07 17:17:54 +08:00
在load 方法里, swizzled_initWithFrame: 和 initWithFrame: 实现调换了,以后调用initWithFrame: 其实实际实现就是 swizzled_initWithFrame: -> initWithFrame: > (super) initWithFrame:
wezzard
2015-04-08 10:30:46 +08:00
樓主連 Swizzle 的目標是哪個 class 都沒有搞清楚呢

swizzled initializer 裏面訪問了 CALayer 的 designated initializer,足矣。
thuai
2015-04-08 14:48:54 +08:00
@wezzard 我只是没有写全代码而已。贴中的swizzle的目标类只要是有initWithFrame这个方法的类不是都可以么?
wezzard
2015-04-08 15:01:57 +08:00
@thuai Sorry, 我看錯了。一樓說的是對的。
thuai
2015-04-08 16:14:07 +08:00
@wezzard 没关系。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/182143

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX