美文网首页
load和initialize顺序

load和initialize顺序

作者: even林0 | 来源:发表于2017-05-26 09:26 被阅读0次

    结论

    • 当子类没有initialize方法时,会调用父类的initialize方法
    • 但是子类没有load方法也不会调用父类的load方法
    • 分类的initialize方法会覆盖原先的initialize方法
    • 原先的load方法和分类的load方法都会走一遍
    #import <Foundation/Foundation.h>
    
    /*
     1.当子类没有initialize方法时,会调用父类的initialize方法
     2.但是子类没有load方法也不会调用父类的load方法
     3.分类的initialize方法会覆盖原先的initialize方法
     4.原先的load方法和分类的load方法都会走一遍
    
     */
    
    
    
    void printMethodInfo(id self,Class clz,SEL _cmd,int line)
    {
        NSLog(@"调用者=%@,当前类=%@,调用方法=%@,行数=%d",
              self,NSStringFromClass([clz class]),NSStringFromSelector(_cmd),line);
    }
    // SuperClass
    @interface SuperClass : NSObject
    @end
    
    @implementation SuperClass
    
    + (void)load
    {
        NSLog(@"superClass 开始load");
        printf("当前所在文件:%s,\n",__FILE__);// %s输出char*,若遇到中文在NSLog中将无法输出,改成利用printf输出
        //第一次调用SuperClass时,会进行初始化,初始化只进行一次
        NSLog(@"调用者=%@,当前类=%@,调用方法=%s,当前行数=%d",self,[SuperClass className],__func__,__LINE__);
        NSLog(@"superClass 结束load");
        
    }
    
    + (void)initialize
    {
        NSLog(@"superClass 开始initialize");
        printMethodInfo(self,[SuperClass class],_cmd,__LINE__);
        NSLog(@"superClass 结束initialize");
        
    }
    @end
    
    // SubClass
    @interface SubClass : SuperClass
    @end
    
    @implementation SubClass
    
    + (void)load
    {
        NSLog(@"subClass 开始load");
        printMethodInfo(self,[SubClass class],_cmd,__LINE__);
        NSLog(@"subClass 结束load");
    }
    
    + (void)initialize
    {
        NSLog(@"subClass 开始initialize");
        printMethodInfo(self,[SubClass class],_cmd,__LINE__);
        NSLog(@"subClass 结束initialize");
    }
    @end
    
    // SubClass (Category)
    @interface SubClass (Category)
    @end
    
    @implementation SubClass (Category)
    
    //分类与本类的load方法都被调用,说明分类与本类是分别加载的
    + (void)load
    {
        NSLog(@"subClass分类 开始load");
        printMethodInfo(self,[SubClass class],_cmd,__LINE__);
        NSLog(@"subClass分类 结束load");
    }
    
    
    //从行号可以看出,分类与本类只调用了分类的初始化方法,说明分类初始化方法覆盖了本类
    + (void)initialize
    {
        NSLog(@"subClass分类 开始initialize");
        printMethodInfo(self,[SubClass class],_cmd,__LINE__);
        NSLog(@"subClass分类 结束initialize");
    }
    @end
    
    int main()
    {
        SubClass * subclz=[[[SubClass class] alloc] init];
        //%@打应对象,会先调用对象的description方法返回NSString*后输出,
        //NSObject中该方法实现为返回<类名: 指针值>
        //重写该方法返回想要的值
        NSLog(@"subclz=%@,指针值=%p",subclz,subclz);
        
        NSLog(@"subclz=%@,指针值=%p",[subclz description],subclz);
        
        NSLog(@"subclz=%@,指针值=%p",[subclz performSelector:@selector(description)],subclz);
        
        NSLog(@"subclz=%@,指针值=%p",[subclz performSelector:NSSelectorFromString(@"description")],subclz);
        
        //上面调用的四中方式是等效的
        
        return 0;
    }
    
    
    /*
     NSLog:
        输出char*时,不允许有中文
     __func__  当前函数签名 %s
     __LINE__  当前行号 %d
     __FILE__  当前文件路径 %s
     */
    
    
    

    相关文章

      网友评论

          本文标题:load和initialize顺序

          本文链接:https://www.haomeiwen.com/subject/wxptfxtx.html