+Load和+initialize方法解析】的更多相关文章

http://www.cnblogs.com/ider/archive/2012/09/29/objective_c_load_vs_initialize.html…
全文转载自:http://www.cocoachina.com/ios/20150104/10826.html 在Objective-C中,NSObject是根类,而NSObject.h的头文件中前两个方法就是load和initialize两个类方法,本篇文章就对这两个方法做下说明和整理. 1.概述 Objective-C作为一门面向对象语言,有类和对象的概念.编译后,类相关的数据结构会保留在目标文件中,在运行时得到解析和使用. 在应用程序运行起来的时候,类的信息会有加载和初始化过程.其实在Ja…
  一.load 方法什么时候调用: 在main方法还没执行的时候 就会 加载所有类,调用所有类的load方法. load方法是线程安全的,它使用了锁,我们应该避免线程阻塞在load方法. 在项目中使用的一些场景: 比如我们要统计所有页面(UIViewController.UITableViewController)的数据,可以在UIViewController的类别里的load方法里实现Method Swizzle @implementation UIViewController (BaseM…
OC中有两个特殊的类方法,分别是load和initialize.本文总结一下这两个方法的区别于联系.使用场景和注意事项.Demo可以在我的Github上找到--load和initialize,如果觉得有帮助还望点个关注以示支持,总结在文章末尾. 先来看看NSObject Class Reference里对这两个方法说明: +(void)initialize The runtime sends initialize to each class in a program exactly one ti…
一.+load方法什么时候调用 +load方法会在runtime加载类.分类时调用(程序运行起来会先去加载调用+load 跟你引用没有引用其头文件没有关系).每个类.分类的+load,在程序运行过程中只调用一次. 调用顺序: 先调用类的+load 按照编译先后顺序调用(先编译,先调用) 调用子类的+load之前会先调用父类的+load 再调用分类的+load 按照编译先后顺序调用(先编译,先调用) 二.为什么原本类的+load方法不会被分类的+load方法覆盖呢? 这是由于+load方法是根据方…
在iOS开发中,就像Application有生命周期回调方法一样,在Objective-C的类被加载和初始化的时候,也可以收到方法回调,可以在适当的情况下做一些定制处理.而这正是本篇文章所要介绍的load和initialize方法可以帮我们做到的. load和initialize的共同特点 load和initialize有很多共同特点,下面简单列一下: ● 在不考虑开发者主动使用的情况下系统最多会调用一次 ● 如果父类和子类都被调用,父类的调用一定在子类之前 ● 都是为了应用运行提前创建合适的运…
NSObject类有两种初始化方式load和initialize load + (void)load; 对于加入运行期系统的类及分类,必定会调用此方法,且仅调用一次. iOS会在应用程序启动的时候调用load方法,在main函数之前调用 执行子类的load方法前,会先执行所有超类的load方法,顺序为父类->子类->分类 在load方法中使用其他类是不安全的,因为会调用其他类的load方法,而如果关系复杂的话,就无法判断出各个类的载入顺序,类只有初始化完成后,类实例才能进行正常使用 load…
可能有些还不清楚load和initialize的区别,下面简单说一下: 首先说一下 + initialize 方法:苹果官方对这个方法有这样的一段描述:这个方法会在 第一次初始化这个类之前 被调用,我们用它来初始化静态变量. initialize方法的调用时机,当向该类发送第一个消息(一般是类消息首先调用,常见的是alloc)的时候,先调用类中的,再调用类别中的(类别中如果有重写):如果该类只是引用,没有调用,则不会执行initialize方法.两者方法的共同点:自动调用父类的,不需要super…
在 NSObject 类中有两个非常特殊的类方法 +load 和 +initialize ,用于类的初始化.这两个看似非常简单的类方法在许多方面会让人感到困惑,比如: 子类.父类.分类中的相应方法什么时候会被调用? 需不需要在子类的实现中显式地调用父类的实现? 每个方法到底会被调用多少次? 下面,我们将结合 runtime(我下载的是当前的最新版本 objc4-646.tar.gz) 的源码,一起来揭开它们的神秘面纱. +load +load 方法是当类或分类被添加到 Objective-C r…
在 Objective-C 中,NSObject 是绝大多数类的基类.而在 NSObject 中有两个类方法 load 和 initialize,那这两个方法是在什么时机被调用呢?父类.Category 的调用顺序又是怎样的呢?本文解读一下这两个方法的区别于联系及使用场景. Load load方法在这个文件被程序装载时调用.只要是在Compile Sources中出现的文件总是会被装载,这与这个类是否被用到无关,因此load方法总是在main函数之前调用.这个很关键,也容易认知出错 调用顺序 如…
今天深圳天气有暴风雨,没有事情干,趁着周末和平常晚上写一篇关于Category知识的梳理!可能针对平常只会知道些category基本结论知道的人有些帮助,写这篇博客会按照下面的目录结合实例以及Category的源码进行一一讲解!!! Category的实现原理? Category中有load方法吗?load方法是什么时候调用的? load.initialize方法的区别是什么?它们在Category中的调用的顺序?以及出现继承时调用过程发生怎样的变化? Category能否添加成员变量?如果可以…
+load() 当类被加载入程序的时候会执行+load方法 +initialize() 当类第一次被使用的时候会执行+initialize方法 这两个方法都只会被执行一次.…
1:类的本质:类也是一种类,可以叫做类类,类对象,类类型: 2:类和对象在内存中分配问题(注意区分类的对象和类对象的概念) 类对象在内存中只有一份,且只加载一次,类对象中存放了类中定义的方法: 而成员变量和isa指针,存放在了类的对象中;isa指针指向了类对象:如图: 3:类本身也是对象,是class类型的对象: // 以person为例 Person *p1 = [[Person alloc] init]; Person *p1 = [[Person alloc] init]; // 获取类对…
Category原理 - Category编译之后的底层结构是 struct categroy_t,里面存储着分类对象方法.属性.协议信息- 当程序运行时,通过runtime动态的将分类的方法.属性.协议合并到一个大数组中- 底层使用的是二维数组进行存储,比如:[[分类2方法列表],[分类1方法列表],[原方法列表]]- 将合并后的分类数据(方法.属性.协议)的数组插入到类原来数据的前面,如上- 因为它遍历分类是按倒序遍历的,所有越后面参与编译的Category数据,会在数组的前面  源码的的…
一.load方法特点: 1. 当类被引用进程序的时候会执行这个函数 2.一个类的load方法不用写明[super load],父类就会收到调用,并且在子类之前. 3.Category的load也会收到调用,但顺序上在主类的load调用之后.如果一个类有多个分类,分类的load调用顺序是根据编译器编译的顺序执行的. 二.initialize方法特点: 1. initialize的自然调用是在第一次主动使用当前类的时候 2.和load不同,即使子类不实现initialize方法,会把父类的实现继承过…
开发中实用方法固然是最贴近应用的,当一些程序原理还是要先搞清晰,根据查找的一些资料,总结了一些load与initialize的调用. APP启动到执行main函数之前,程序就执行了很多代码   执行顺序:                将程序依赖的动态链接库加载到内存 —> 加载可执行文件中的所有符号,代码runtime解析被编译的符号代码—>遍历多有的class—>按继承层级一次调用Class的load和category的load方法. 2个类初始化方法,+(void)load和+(v…
APP 启动到执行 main 函数之前,程序就执行了很多代码. 执行顺序: 将程序依赖的动态链接库加载到内存 加载可执行文件中的所有符号,代码 runtime 解析被编译的符号代码 遍历所有的 class 按继承层级一次调用 Class 的 load 和 category 的 load 方法. 一.+load +load 方法是当类或分类被添加到 Objective-C runtime 时被调用的,实现这个方法可以让我们在类加载的时候执行一些类相关的行为.子类的 +load 方法会在它的所有父类…
OC load与initialize load 当类被引用进程序的时候会执行这个函数 一个类的load方法不用写明[super load],父类就会收到调用,并且在子类之前. Category的load也会收到调用,但顺序上在主类的load调用之后. initialize initialize的自然调用是在第一次主动使用当前类的时候 和load不同,即使子类不实现initialize方法,会把父类的实现继承过来调用一遍.注意的是在此之前,父类的方法已经被执行过一次了,同样不需要super调用.…
Objective C类方法load和initialize的区别   过去两个星期里,为了完成一个工作,接触到了NSObject中非常特别的两个类方法(Class Method).它们的特别之处,在于iOS会在运行期提前并且自动调用这两个方法,而且很多对于类方法的规则(比如继承,类别(Category))都有不同的处理. 而因为这两个方法是在程序运行一开始就被调用的方法,我们可以利用他们在类被使用前,做一些预处理工作.比如我碰到的就是让类自动将自身类名保存到一个NSDictionary中. 先来…
NSObject是一切OC类的基类,所以我们必须对NSObject所有的方法有一个清楚的认识. + (void)load; 当类或者分类被加入到runtime时,load方法会被调用,也就是说在main循环开始前load方法就已经被调用. (当类被加载到进程的address space时,runtime就会给每个类发送load消息.For classes that are in a shared (dynamically-loaded) library, the runtime sends th…
前一篇文章已经介绍了如何通过URL从网络上获取xml数据.下面介绍如何将获取到的数据进行解析. 下面先看看xml的数据格式吧! <?xml version="1.0" encoding="UTF-8"?> <Books> <Book id="1"> <title>Circumference</title> <author>Nicholas Nicastro</autho…
这篇文章来对比一下NSObject类的两个方法,+load与+initialize. + (void)load; Invoked whenever a class or category is added to the Objective-C runtime; implement this method to perform class-specific behavior upon loading. 不管一个类.类别是被动态加载或者静态链接,都会被发送load消息,但是只有新加入的类或者类别实现…
load: 当类被引用进项目的时候(类文件加载到系统中)就会执行load函数(在main函数开始执行之前),与这个类是否被用到无关,每个类的load函数只会自动调用一次.由于load函数是系统自动加载的,因此不需要调用父类的load函数,否则父类的load函数会多次执行. 1.当父类和子类都实现load函数时,父类的load方法执行顺序要优先于子类 2.当子类未实现load方法时,不会调用父类load方法 3.类中的load方法执行顺序要优先于类别(Category) 4.当有多个类别(Cate…
+ (void)initializeDescription(描述)    Initializes the class before it receives its first message. 在这个类第一次接受信息之前初始化这个类. The runtime sends initialize to each class in a program just before the class, or any class that inherits from it, is sent its first…
1.+load方法当类或分类添加到object-c runtime时被调用,子类的+load方法会在它所有父类的+load方法之后执行,而分类的+load方法会在它的主类的+load方法之后执行.但不同的类之间的+load方法的调用顺序是不确定的,所以不要在此方法中用另一个类. 2.+load方法不像普通方法一样,它不遵循那套继承规则.如果某个类本身没有实现+load方法,那么不管其它各级超类是否实现此方法,系统都不会调用.+load方法调用顺序是:SuperClass -->SubClass…
总得来说: 1.+load方法是在main函数之前调用的: 2.遵从先父类后子类,先本类后列类别的顺序调用: 3.类,父类与分类之间的调用是互不影响的.子类中不需要调用super方法,也不会调用父类的+load方法实现: 4.无论该类是否接收消息,都会调用+load方法: 总得来说: 1.+initialize方法是在main函数之后调用的: 2.+initialize方法遵从懒加载方式,只有在类或它的子类收到第一条消息之前被调用的; 3.子类中不需要调用super方法,会自动调用父类的方法实现…
本文转载自: http://hanjianwei.com/2013/07/25/python-mro/ 对于支持继承的编程语言来说,其方法(属性)可能定义在当前类,也可能来自于基类,所以在方法调用时就需要对当前类和基类进行搜索以确定方法所在的位置.而搜索的顺序就是所谓的「方法解析顺序」(Method Resolution Order,或MRO).对于只支持单继承的语言来说,MRO 一般比较简单:而对于 Python 这种支持多继承的语言来说,MRO 就复杂很多. 先看一个「菱形继承」的例子: 如…
sqlalchemy mark-deleted 和 python 多继承下的方法解析顺序 MRO 今天在弄一个 sqlalchemy 的数据库基类的时候,遇到了跟多继承相关的一个小问题,因此顺便看了一下 MRO mark-deleted 在 sqlalchemy 中的实现 在做数据库的类时,由于重要的数据都不能直接删除,需要使用 mark-deleted 的方式,即在数据库中保留一个 deleted 的标记字段,根据这个标记来区分数据是否已被标记删除.被 mark-deleted 的数据,在普通…
概述 Orchard作为一个可扩展的CMS系统,是由一系列的模块(Modules)或主题(Themes)组成,这些模块或主题统称为扩展(Extensions).在初始化或运行时需要对扩展进行安装:DefaultOrchardHost.SetupExtensions方法. 当添加新的扩展.删除扩展或修改扩展源码后,需要通知扩展加载器(Extension Loader)重新加载或完成一些清理工作,所以需要进行监视:DefaultOrchardHost.MonitorExtensions方法. Orc…
(1)使用TouchJSon解析方法:(需导入包:#import "TouchJson/JSON/CJSONDeserializer.h") //使用TouchJson来解析北京的天气 - (IBAction)btnPressTouchJson:(id)sender {     //获取API接口     NSURL *url = [NSURL URLWithString:@"http://m.weather.com.cn/data/101010100.html"]…