文档章节

OC中initialize方法和init方法的区别

哪一种黑
 哪一种黑
发布于 2016/02/27 22:09
字数 860
阅读 30
收藏 0
点赞 1
评论 0

Objective-C中是带有运行时间的。

运行时间好处是,它可以在你的程序运行的流程中进行参与。在Objective-C中,它包括检查是否一个对象可以处理特定的消息,如果不能处理,它就帮助你自动调用其他特定的方法去完成。

initialize不是init


运行时间的行为之一就是initialize。虽然看起来有点像大家常见的init,但是他们并不相同。

在程序运行过程中,它会在你程序中每个类调用一次initialize。这个调用的时间发生在你的类接收到消息之前,但是在它的超类接收到initialize之后。

举个例子,比如一个叫做Duck的类:

#import "Duck.h";
 
@implementation Duck
 
+(void) initialize {
    NSLog(@"Duck initialize");
}
 
-(void) init {
    NSLog(@"Duck init");
}
@end

我们在这里记录initialize和init调用的时间。

我们建立三个Duck对象的实例:

NSLog(@"Hello, World!");

Duck* duck1 = [[Duck alloc] init];

Duck* duck2 = [[Duck alloc] init];

Duck* duck3 = [[Duck alloc] init];
 
看一下记录:

[Session started at 2008-03-23 20:03:25 -0400.]

2016-02-27 20:03:25.869 initialize_example[30253:10b] Hello, World!

2016-02-27 20:03:25.871 initialize_example[30253:10b] Duck initialize

2016-02-27 20:03:25.872 initialize_example[30253:10b] Duck init

2016-02-27 20:03:25.873 initialize_example[30253:10b] Duck init

2016-02-27 20:03:25.873 initialize_example[30253:10b] Duck init

我们可以看到,虽然我们创建了3个Duck的实例,但是initialize仅仅被调用了一次。我们也可以看到,直到我们创建了一个Duck的实例,initialize才被调用。

但是如果Duck有一个子类的话,比如我们建一个Duck的子类叫做Chicken

#import <cocoa/Cocoa.h>

#import "Duck.h"
 
@interface Chicken : Duck {
 
}
 
@end

注意Chicken这个类并没有实现initialize方法。

如果我们同样运行这个程序,但是加上一个Chicken的实例:

NSLog(@"Hello, World!");

Duck* duck1 = [[Duck alloc] init];
Duck* duck2 = [[Duck alloc] init];
Duck* duck3 = [[Duck alloc] init];
    
Chicken* chicken = [[Chicken alloc] init];
 
我们期待看到4个Duck的init调用(因为我们建立了3个Duck和一个Chicken),但是我们看到了这样情况:

[Session started at 2016-02-27 20:13:34 -0400.]

2016-02-27 20:13:34.696 initialize_example[30408:10b] Hello, World!

2016-02-27 20:13:34.698 initialize_example[30408:10b] Duck initialize

2016-02-27 20:13:34.699 initialize_example[30408:10b] Duck init
 
2016-02-27 20:13:34.700 initialize_example[30408:10b] Duck init
 
2016-02-27 20:13:34.700 initialize_example[30408:10b] Duck init
 
2016-02-27 20:13:34.700 initialize_example[30408:10b] Duck initialize
 
2016-02-27 20:13:34.701 initialize_example[30408:10b] Duck init

我们看到了4个Duck的init和2个Duck的initialize方法。这是怎么回事呢?

看来如果一个子类没有实现initialize方法,那么超类会调用这个方法两次,一次为自己,而一次为子类。

我们在Duck的initialize类中记录一下类名,这样可以看得更清楚:
 
+(void) initialize {
   NSLog(@"Duck initialize class:%@",[self class]);
}

现在看明白了:

[Session started at 2016-02-27 20:21:08 -0400.]
 
2016-02-27 20:21:08.816 initialize_example[30513:10b] Hello, World!
 
2016-02-27 20:21:08.818 initialize_example[30513:10b] Duck initialize class:Duck
 
2016-02-27 20:21:08.819 initialize_example[30513:10b] Duck init
 
2016-02-27 20:21:08.820 initialize_example[30513:10b] Duck init
 
2016-02-27 20:21:08.820 initialize_example[30513:10b] Duck init
 
2016-02-27 20:21:08.820 initialize_example[30513:10b] Duck initialize class:Chicken

2016-02-27 20:21:08.821 initialize_example[30513:10b] Duck init

如果你希望确定只用了initialize一次用来实现某些单独运行的工作,或者希望实现仅仅运行一次的方法,检查一下[self class],才能确定是否是你希望做到的效果。


© 著作权归作者所有

共有 人打赏支持
哪一种黑
粉丝 8
博文 11
码字总数 9722
作品 0
昌平
oc 类和对象

一 、oc语言的特点 C语言的超集,允许在oc中使用c语言源代码,编译器兼容C语言程序 具备完善的面向对象特性 包含一个运行时系统 类库丰富 二、基本介绍 面向对象编程OOP(Object Oriented Pro...

黑伞将军 ⋅ 2015/08/03 ⋅ 0

XZ_Swift之Swift面向对象

Swift面向对象 1、关于命名空间 在 Swift 中,默认同一个项目中,所有的类都是共享的,可以直接访问,不需要 import 所有对象的属性 var,也可以直接访问到 在Swift中,所有类都默认有一个命名空间...

understand_XZ的博客 ⋅ 2017/12/22 ⋅ 0

自定义选项卡实战swift(内附源码且精讲知识点)

App开发本质上是一种对人性的把握,我们在项目开发过程中经常需要自定义很多精美的控件,以此来获得更好的用户体验。 因此,掌握自定义控件是移动应用开发必备的一项技能。本篇文章我们就来快...

充电实践 ⋅ 05/26 ⋅ 0

BAT面试笔记

1、亿级日志中,查找登陆次数最多的十个用户 解题思路:先用哈希表保存登陆次数和ID,然后用红黑树保存最大的十个数。 2、说说你对 OC 中 load 方法和 initialize 方法的异同。 主要说一下执...

背锅侠 ⋅ 2016/04/18 ⋅ 0

Object-C基础-04-自定义构造方法和description方法

知识回顾 在第5讲中已经介绍了如何定义类和创建并初始化对象,比如有Student这个类 1.Student.h #import <Foundation/Foundation.h> @interface Student : NSObject { int _age;}- (void)se......

Corwien ⋅ 2016/03/17 ⋅ 0

IOS OC 对象内部尽量直接访问实例变量

在对象之外访问实例变量时,应该通过属性来做,然而在对象内部访问实例变量,强烈建议读取实例变量的时候通过直接访问的形式,而在设置实例变量的时候通过属性来做。 一 self.property 和_pr...

卧龙小 ⋅ 2015/07/01 ⋅ 0

OC学习之旅 (一) 内存管理及OC常用方法

最近学习OC,所以在博客写下自己的笔记. OC的基本: 1 id 相当于java的Object 代表任何对象. 所以id是关键字,不能用作变量!! 2 oc中使用"."符号是调用 int a =object.a 是调用的是 [object ge...

Jonson ⋅ 2013/04/13 ⋅ 2

OC之类和对象

从今天开始我的IOS开发算是起步了,第一天学习Objective-C,感觉不是很爽。作为一名Java程序猿的我,第一次使用OC语法什么的都不习惯,尤其是@到处都是,不过,今天看看还是有点儿收获的。 ...

斯特凡 ⋅ 2015/06/12 ⋅ 0

OC语言的特性(一)-消息传递与调用函数的表现形式

我们在初学Objective-C时,都会觉得ObjC中的消息传递和其他语言的调用函数差不多,只是在OC中,方法调用用消息传递这一概念来代替。 那么到底怎样区别OC中的消息传递与其他语言的调用函数呢。...

浩浩老师 ⋅ 2015/09/08 ⋅ 0

Objective C基础与提高视频课程(一)

腾讯视频课程: 第一讲 Objective C的类 链接:http://dwz.cn/zH5G8 类的定义 Objective-C的类分为两个文件,一个是.h文件一个是.m文件 .h文件存放类、函数声明,类声明用关键字@interface ...

马洪伟 ⋅ 2015/01/05 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

10个免费的服务器监控工具

监控你的WEB服务器或者WEB主机运行是否正常与健康是非常重要的。你要确保用户始终可以打开你的网站并且网速不慢。服务器监控工具允许你收集和分析有关你的Web服务器的数据。 有许多非常好的服...

李朝强 ⋅ 33分钟前 ⋅ 0

压缩工具之zip-tar

zip 支持目录压缩。使用yum安装zip包,使用yum安装unzip包 zip 1.txt.zip 1.txt #将1.txt文件压缩,新生成的压缩文件为1.txt.zip,原文件保留 zip -r 123.zip 123/ #-r对目录操作。将123/目录...

ZHENG-JY ⋅ 34分钟前 ⋅ 0

Dubbo @Activate注解使用和实现解析

Activate注解标识一个扩展是否被激活和使用,可以放在定义的类上和方法上,dubbo用它在SPI扩张类定义上,标识这个扩展实现激活的条件和时机,先看下定义: /** * Activate * <p/> * ...

哲别0 ⋅ 40分钟前 ⋅ 0

6.5 zip压缩工具 tar打包 打包并压缩

1.tar tar命令格式 [-zjxcvfpP] filename tar -z:表示同时用gzip压缩。 -j:表示同时用bzip2压缩。 -J:表示同时用xz压缩。 -x:表示解包或者解压缩。 -t:表示查看tar包里的文件。 -c:表示建...

oschina130111 ⋅ 42分钟前 ⋅ 0

Linux系统工程狮养成记

如今的社会,随着时代的发展,出现了很多职业,像电子类,计算机类的专业,出现了各种各样的工程师,有算法工程师,java工程师,前端工程师,后台工程师,Linux工程师,运维工程师等等,不同...

六库科技 ⋅ 49分钟前 ⋅ 0

Linux 机器的渗透测试命令备忘表

如下是一份 Linux 机器的渗透测试备忘录,是在后期开发期间或者执行命令注入等操作时的一些典型命令,设计为测试人员进行本地枚举检查之用。 此外,你还可以从这儿(https://gbhackers.com/c...

寰宇01 ⋅ 50分钟前 ⋅ 0

windows 安装java开发环境,配置jdk

下载jdk安装文件 链接:https://pan.baidu.com/s/1UEKPjnAdMqNj612B39Pfsg 密码:ipqx 如果javac无法使用 1,检查环境变量名称中是否有空格。。。,去除后即可 2,将JAVA_HOME替换为原始路径...

阿豪boy ⋅ 52分钟前 ⋅ 0

简析log4j的实现方式

刚加入新公司,对日志的要求比较严格,对此特意花了几天时间看了一下log4j的源码,大概了解了一下log4j的实现方式,总结如下: log4j的实现分为两个步骤:log4j.xml的加载,logger的使用 这里...

zdatbit ⋅ 今天 ⋅ 0

win环境下jdk7与jdk8共存配置

1.jdk安装包 jdk安装包 安装步骤略 2.jdk等配置文件修改 在安装JDK1.8时(本机先安装jdk1.7再安装的jdk1.8),会将java.exe、javaw.exe、javaws.exe三个文件copy到了C:\Windows\System32,这...

泉天下 ⋅ 今天 ⋅ 0

windows profesional 2017 build problem

.net framework .... https://stackoverflow.com/questions/43330915/could-not-load-file-or-assembly-microsoft-build-frameworkvs-2017...

机油战士 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部