方法 [load] 是不是需要调用 [super load]

Posted

技术标签:

【中文标题】方法 [load] 是不是需要调用 [super load]【英文标题】:Does method [load] need to call [super load]方法 [load] 是否需要调用 [super load] 【发布时间】:2015-12-31 06:43:40 【问题描述】:

我知道很多方法需要调用它的超类方法,有些方法不需要,

我正在寻找关于方法调配的东西。它在加载方法中初始化,在教程中没有[super load]

我想知道是错了还是没必要打电话给[super load]

+ (void)load 
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^
        Class class = [self class];

        // When swizzling a class method, use the following:
        // Class class = object_getClass((id)self);

        SEL originalSelector = @selector(pushViewController:animated:);
        SEL swizzledSelector = @selector(flbs_pushViewController:animated:);

        Method originalMethod = class_getInstanceMethod(class, originalSelector);
        Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);

        BOOL didAddMethod =
        class_addMethod(class,
                        originalSelector,
                        method_getImplementation(swizzledMethod),
                        method_getTypeEncoding(swizzledMethod));

        if (didAddMethod) 
            class_replaceMethod(class,
                                swizzledSelector,
                                method_getImplementation(originalMethod),
                                method_getTypeEncoding(originalMethod));
         else 
            method_exchangeImplementations(originalMethod, swizzledMethod);
        
    );


#pragma mark - Method Swizzling

- (void)flbs_pushViewController:(UIViewController *)viewController animated:(BOOL)animated 
    dispatch_async(dispatch_get_main_queue(), ^
        [self flbs_pushViewController:viewController animated:animated];
    );
    NSLog(@"flbs_pushViewController");

顺便说一下,这个方法是用来修复导航损坏的。

我碰巧有时会再次出现问题,我调试了它,我认为它是关于线程的。所以我做这个混搭以在系统方法中添加一些东西。

如果您能说出导航损坏问题或这种方法混乱的问题,我也非常感谢。

【问题讨论】:

调用 [super load] 的最佳实践,以便所有组件都能获得发生事件的通信。 @nikhil84 盲目地遵循任何原则都是让自己陷入困境的好方法。 Anyway,+load is a very special case. 【参考方案1】:

来自NSObject documentation (强调):

一个类的+load 方法在其所有超类的+load 方法之后调用。

这意味着您不必从代码中调用[super load]。 所有超类的load 方法已经被调用 由 Objective-C 运行时调用您的子类中的方法。

【讨论】:

...所以,如果您调用[super load];,超类的实现将运行两次 但是如果我覆盖 [load] 方法? @HensonFang:对不起,我不明白你在问什么。本问答是关于重载load 方法的。

以上是关于方法 [load] 是不是需要调用 [super load]的主要内容,如果未能解决你的问题,请参考以下文章

子类要调用父类的方法,必须使用super关键字。这句话对吗,为啥?

super代替类名

在define_method定义的方法上调用super

子类-父类构造方法调用问题

super_父类

python使用super()调用父类的方法