• load方法的执行时机
          Objetive-C 的runtime会在一个类的所有方法加载到内存中时调用这个类的+load() 方法,因为每个类的方法只是加载一次,所以每个+load()方法只调用一次。
          加载一个类的方法会在一个进程启动开始的时候,这个时候进程的业务代码没有还没有开始执行。
          对于动态库中的类,类的+load方法会在动态库加载进进程的内存空间时的时候执行
 
  • load的执行次序
          +load的方法会从父类到子类的顺序执行,对于一个类的扩展中的Load方法,执行顺序是不确定的。
          +load的方法不遵从其它继承方法执行的规律,只有一个类或者扩展存在load方法的时候才会执行。原因是load的方法的imp查找是直接通过特殊的方法查找的,见
          
/***********************************************************************
* _class_getLoadMethod
* fixme
* Called only from add_class_to_loadable_list.
* Locking: runtimeLock must be read- or write-locked by the caller.
**********************************************************************/
IMP
_class_getLoadMethod(Class cls_gen)
{
    rwlock_assert_locked(&runtimeLock);     class_t *cls = newcls(cls_gen);
    const method_list_t *mlist;
    uint32_t i;     assert(isRealized(cls));
    assert(isRealized(cls->isa));
    assert(!isMetaClass(cls));
    assert(isMetaClass(cls->isa));     mlist = cls->isa->data()->ro->baseMethods;
    if (mlist) for (i = 0; i < mlist->count; i++) {
        method_t *m = method_list_nth(mlist, i);
        if (0 == strcmp((const char *)m->name, "load")) {
            return m->imp;
        }
    }     return NULL;
}
 
 
     下面是一个Demo
 
 
 
@interface initTest : NSObject
@end
 
@interface sub1 : initTest
@end
 
@interface sub2 : sub1
@end
 
@interface sub2 (category1)
@end
@interface sub2 (category2)
@end
 
 
//实现
 
@implementation initTest

//+(void)initialize
//{
//    NSLog(@"%s|%@  ",__func__ ,[self class]);
//}

+(void)load
{
    NSLog(@"%s  ",__func__ );
}

@end

@implementation sub1

//+(void)initialize
//{
//    NSLog(@"%s|%@  ",__func__ ,[self class]);
//}

//+(void)load
//{
//    NSLog(@"%s  ",__func__ );
//}
@end

@implementation sub2

//+(void)initialize
//{
//    NSLog(@"%s|%@  ",__func__ ,[self class]);
//}

+(void)load
{
    NSLog(@"%s  ",__func__ );
}

@end

@implementation sub2 (category1)

+(void)load
{
    NSLog(@"%s  ",__func__ );
}

@end

@implementation sub2 (category2)

+(void)load
{
    NSLog(@"%s  ",__func__ );
}

@end
 
执行结果如下:
 
2015-05-26 13:09:37.955 OCinitTest[79585:72506319] +[initTest load] 
2015-05-26 13:09:37.956 OCinitTest[79585:72506319] +[sub2 load] 
2015-05-26 13:09:37.956 OCinitTest[79585:72506319] +[sub2(category1) load] 

2015-05-26 13:09:37.956 OCinitTest[79585:72506319] +[sub2(category2) load]  
 
  • load方法可以用来做什么
          对于一个方法的Swizzle,因为这个时候改变runtime中得方法比执行中改变更安全

Objetive-C +load方法研究的更多相关文章

  1. 你真的了解load方法么?(转载)

    本文授权转载,作者:左书祺(关注仓库,及时获得更新:iOS-Source-Code-Analyze) 因为 ObjC 的 runtime 只能在 Mac OS 下才能编译,所以文章中的代码都是在 Ma ...

  2. initialize和init以及load方法的区别与使用以及什么时候调用

    initialize不是init initialize在这个类第一次被调用的时候比如[[class alloc]init]会调用一次initialize方法,不管创建多少次这个类,都只会调用一次这个方 ...

  3. jQuery load()方法用法集锦!

    调用load方法的完整格式是:DE>load( url, [data], [callback] ),其中DE> DE>urlDE>:是指要导入文件的地址. DE>data ...

  4. easyUi load方法重新加载表单的数据

    1.表单回显数据的方法 <script> //方法一 function loadLocal(){ $('#ff').form('load',{ name:'myname', email:' ...

  5. load()方法---------jQuery动态加载html

    jquery代码 $("#div").load("test.html"); test.html   ----------------被加载页面(有<HTM ...

  6. Hibernate框架之get和load方法的区别

    我们在学习Hibernate框架时,经常会进行修改,删除操作,对于这些操作,我们都应该先加载对象,然后在执行或删除的操作,那么这里Hibernate提供了两种方法按照主键加载对象,也就是我要说的get ...

  7. 在 ASP.NET 中使用 jQuery.load() 方法

    今天就让我们看看在 ASP.NET 中使用 jQuery.load() 方法来调用 ASP.NET 的方法,实现无刷新的加载数据. 使用 jQuery 的朋友应该知道可以使用 jQuery.load( ...

  8. DataTable .Load 方法 (IDataReader)

    DataTable .Load 方法 (IDataReader)用来从DataReader对象中填充DataTable所需的数据 public DataTable GetAllInventory() ...

  9. [原创]java WEB学习笔记79:Hibernate学习之路--- 四种对象的状态,session核心方法:save()方法,persist()方法,get() 和 load() 方法,update()方法,saveOrUpdate() 方法,merge() 方法,delete() 方法,evict(),hibernate 调用存储过程,hibernate 与 触发器协同工作

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

随机推荐

  1. GTK+2.0学习——第一个GTK程序

    #include <gtk/gtk.h> #include <stdio.h> #include <stdlib.h> /* *点击了关闭按钮之后的回调函数 *gt ...

  2. radio里面value值与其他字符进行比较

    本题旨在创建一个具有及时反馈的选择题,当选完其中一个选项后,会有弹窗来提醒你选择的答案是正确还是错误的.<div id="text" style="display: ...

  3. python学习——DAY1

    日期:20170113 一.个人体会: 零基础学python,是艰辛的,需要付出和坚持. 关于流程图.我最开始画的是从上到下,再从左到右,画了很多重复的内容,单线程的流程图,看起来很容易理解,但是自己 ...

  4. angular中的cookie读写

    AngularJS中对cookie的操作封装了一个单独的模块,模块名为ngCookies,若想使用需在页面中先引入angular-cookies.js: <script src="js ...

  5. Linux的一些简单命令(四)-用户和组账户管理

    linux操作系统是一个多用户操作系统,它允许多用户同时登录到系统上并使用资源.系统会根据账户来区分每个用户的文件,进程,任务和工作环境,使得每个用户工作都不受干扰 1.保存用户信息的文件:/etc/ ...

  6. nginx在window上无法启动的问题

    内容列表: 简要介绍 下载安装 配置测试 一.简要介绍 Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP ...

  7. 【ARM】S5PV210芯片的启动流程

    S5PV210芯片的设计者的思想 (1)芯片启动后执行iRom(BL0)的内容,进行时钟和看门狗等外设的初始化,将BL1和BL2拷贝到片内SRAM; (2)跳转到片内SRAM执行,完成外部SDRAM的 ...

  8. java基础第二天

    学习了关键字,标识符,数据类型.变量和常量,运算符和表达式,开始编写一些简单的输入输出运算的程序了.

  9. 在vmware workstation10上安装ubuntu14.04,出现以下问题

    VMware提示:已将该虚拟机配置为使用 64 位客户机操作系统.但是,无法执行 64 位操作. (1)设置bois 对于HP电脑来说,刚开机时,按住F10,会出现以下界面: 然后回车进行设置: 重启 ...

  10. java读写锁源码分析(ReentrantReadWriteLock)

    读锁的调用,最终委派给其内部类 Sync extends AbstractQueuedSynchronizer /** * 获取读锁,如果写锁不是由其他线程持有,则获取并立即返回: * 如果写锁被其他 ...