thuai
V2EX  ›  iOS

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

  •  
  •   thuai · Apr 7, 2015 · 3285 views
    This topic created in 4082 days ago, the information mentioned may be changed or developed.

    一般写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上大神多,请轻喷!谢谢:)

    5 replies    2015-04-08 16:14:07 +08:00
    ambitiouspei
        1
    ambitiouspei  
       Apr 7, 2015
    在load 方法里, swizzled_initWithFrame: 和 initWithFrame: 实现调换了,以后调用initWithFrame: 其实实际实现就是 swizzled_initWithFrame: -> initWithFrame: > (super) initWithFrame:
    wezzard
        2
    wezzard  
       Apr 8, 2015
    樓主連 Swizzle 的目標是哪個 class 都沒有搞清楚呢

    swizzled initializer 裏面訪問了 CALayer 的 designated initializer,足矣。
    thuai
        3
    thuai  
    OP
       Apr 8, 2015
    @wezzard 我只是没有写全代码而已。贴中的swizzle的目标类只要是有initWithFrame这个方法的类不是都可以么?
    wezzard
        4
    wezzard  
       Apr 8, 2015
    @thuai Sorry, 我看錯了。一樓說的是對的。
    thuai
        5
    thuai  
    OP
       Apr 8, 2015
    @wezzard 没关系。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1124 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 18:03 · PVG 02:03 · LAX 11:03 · JFK 14:03
    ♥ Do have faith in what you're doing.