IOS杂笔- 7(类方法load与initialize的区别 浅析)

在介绍两种类方法之前,NSObject Class Reference里对这两个方法说明:

+(void)initialize

The runtime sends initialize to each class in a program exactly one time just before the class, or any class that inherits from it, is sent its first message from within the program. (Thus the method may never be invoked if the class is not used.) The runtime sends the initialize message to classes in a thread-safe manner. Superclasses receive this message before their subclasses.

翻译:运行库在一个程序中每一个类的一个程序中发送一个初始化一次,或是从它继承的任何类中,都是在程序中发送第一条消息。(因此,当该类不使用时,该方法可能永远不会被调用。)运行时发送一个线程安全的方式初始化消息。收到这个消息之前,他们的子类父类。

+(void)load

The load message is sent to classes and categories that are both dynamically loaded and statically linked, but only if the newly loaded class or category implements a method that can respond.
The order of initialization is as follows:

  1. All initializers in any framework you link to.
  2. All +load methods in your image.
  3. All C++ static initializers and C/C++ __attribute__(constructor) functions in your image.
  4. All initializers in frameworks that link to you.

In a custom implementation of load you can therefore safely message other unrelated classes from the same image, but any loadmethods implemented by those classes may not have run yet.

翻译:加载消息被发送到动态加载和静态链接的类和类别,但只有当新加载的类或类实现了可以响应的方法。初始化的顺序如下:

在任何框架链接到你所有的初始化。

所有的负载方法在您的图像。

所有c++静态初始化器和C / c++使用__attribute__(构造函数)函数在你的形象

所有初始化框架链接到你。

在一个自定义实现负载可以因此安全消息其他不相关的类相同的图像,但任何负载方法的实现类可能尚未运行。

------------------------------------------------

Apple的文档很清楚地说明了initialize和load的区别在于:load是只要类所在文件被引用就会被调用,而initialize是在类或者其子类的第一个方法被调用前调用。所以如果类没有被引用进项目,就不会有load调用;但即使类文件被引用进来,但是没有使用,那么initialize也不会被调用。

它们的相同点在于:方法只会被调用一次。(其实这是相对runtime来说的,后边会做进一步解释)。

文档也明确阐述了方法调用的顺序:父类(Superclass)的方法优先于子类(Subclass)的方法,类中的方法优先于类别(Category)中的方法。

时间: 2024-09-29 21:02:44

IOS杂笔- 7(类方法load与initialize的区别 浅析)的相关文章

Objective C类方法load和initialize的区别

它们的特别之处,在于iOS会在运行期提前并且自动调用这两个方法,而且很多对于类方法的规则(比如继承,类别(Category))都有不同的处理. 先来看看NSObject Class Reference里对这两个方法说明: +(void)initialize The runtime sends initialize to each class in a program exactly one time just before the class, or any class that inherit

类方法load和initialize的区别

1.+load方法当类或分类添加到object-c runtime时被调用,子类的+load方法会在它所有父类的+load方法之后执行,而分类的+load方法会在它的主类的+load方法之后执行.但不同的类之间的+load方法的调用顺序是不确定的,所以不要在此方法中用另一个类. 2.+load方法不像普通方法一样,它不遵循那套继承规则.如果某个类本身没有实现+load方法,那么不管其它各级超类是否实现此方法,系统都不会调用.+load方法调用顺序是:SuperClass -->SubClass

IOS 杂笔-19(属性与变量的优缺点)

IOS 杂笔-19(属性与变量的优缺点) 在前面的文章中我介绍了属性与变量的区别.这篇博客我将会简单介绍一下属性与变量的优缺点. 变量 优点: 访问速度快 缺点: 使用不灵活 属性 缺点: 耗时 优点: 防止对象被提前创建 防止对象重复创建 防止对象使用时,还没被创建 可以在懒加载方法里面,进行初始化操作

iOS load和initialize的区别

可能有些还不清楚load和initialize的区别,下面简单说一下: 首先说一下 + initialize 方法:苹果官方对这个方法有这样的一段描述:这个方法会在 第一次初始化这个类之前 被调用,我们用它来初始化静态变量. initialize方法的调用时机,当向该类发送第一个消息(一般是类消息首先调用,常见的是alloc)的时候,先调用类中的,再调用类别中的(类别中如果有重写):如果该类只是引用,没有调用,则不会执行initialize方法.两者方法的共同点:自动调用父类的,不需要super

Objective-C类方法 load 和 initialize

1.区别:+load 是只要类所在文件被引用就会被调用,而 +initialize 是在类或者其子类的第一个方法被调用前调用.所以如果类没有被引用进项目,就不会有 +load 调用:但即使类文件被引用进来,如果没有使用,那么 +initialize 也不会被调用. 2.相同点:方法只会被调用一次. 3.+load 方法探讨 结论 :+load 的执行顺序是先父类 再到子类,后 category,而 category 的 +load 执行顺序是根据编译顺序决定的. 4.+initialize 方法

IOS 杂笔-12(类别de巧用 有便于Frame的操作)

在实际开发中很多时候我们都为了控件frame的操作焦头烂额. 例如:我们只想要获取view的width. 我们可以这么操作:view.frame.size.width 有时我们想要改变view的width然而我们不能直接改变->需要三部曲. 让人抓狂,为了解决这里烦恼我们可以通过改变类别来达到理想的效果. 下面是类别的.h文件: // // UIView+CXExtension.h //// // Created by ma c on 16/3/25. // Copyright ? 2016年

IOS 杂笔-11(实现在外部无法改变UIView的size)

我想题目说的或许不是很清楚,那么现在我详细介绍一下这篇随笔内容. 在外部无法改变UIVIew控件的size. 这里说是UIView,但是事实上,是大多数控件而绝非仅UIView. 想要实现在外部无法改变size该怎么做呢. 首先是重写setFrame使其规定本身size,如下 // // TestView.m // CX-实现在外部无法改变UIView的Size // // Created by ma c on 16/3/25. // Copyright ? 2016年 xubaoaichiyu

IOS 杂笔-13(appearance的巧妙使用)

NSDictionary * attrs = @{ NSFontAttributeName:[UIFont systemFontOfSize:13], NSForegroundColorAttributeName:[UIColor grayColor] }; NSDictionary * selectAttrs = @{ NSFontAttributeName:[UIFont systemFontOfSize:12], NSForegroundColorAttributeName:[UIColo

IOS 杂笔-14(被人遗忘的owner)

*owner在开发中现在已经很少用了 有兴趣的童鞋可以看看* 我们遇到owner通常是在类似 [[[NSBundle mainBundle] loadNibNamed:@"Food" owner:nil options:nil]lastObject ]中遇到的. 我们一般的做法是直接把owner设置为self(通常是咋自定义cell时). 但是在定义其他控件时我们就需要想一想为什么,或者还有什么需要注意的. 下面我开始对owner进行介绍. 先仔细观察下面gif的内容: 不难发现,我在