koorio.com
海量文库 文档专家
当前位置:首页 >> IT/计算机 >>

Objective-C的Initialize初始化方法研究

这篇文章介绍了 Objective-C 比较底层的内容,主要讲解 initialize 和 init 方法的 区别。从这篇文章中我们不光可以了解 Objective-C 在初始化时所做的事情,更 可以学习到一些如何研究 Objective-C 语言内部到底做了什么的方法,这样你也 可以自己对更深层次的内容进行探寻。

原文地址: http://kupuk.com/2008/03/23/objective-c-initialize-method/ 作者:Paul Robinson Objective-C 很有趣的一个地方是,它非常非常像 C。实际上,它就是 C 语言加 上一些其他扩展和一个运行时间(runtime)。 有了这个在每个 Objective-C 程序中都会起作用的附加运行时间,给了它一些动 态的特性。C 和 C++没有运行时间,他们仅仅被编译为完全按照代码的顺序去 执行,不多也不少。 Objective-C 中带有运行时间的好处是,它可以在你的程序运行的流程中进行参 与。在 Objective-C 中,它包括检查是否一个对象可以处理特定的消息,如果不 能处理,它就帮助你自动调用其他特定的方法去完成。

initialize 不是 init

运行时间的行为之一就是 initialize。虽然看起来有点像大家常见的 init,但是他 们并不相同。 在程序运行过程中,它会在你程序中每个类调用一次 initialize。这个调用的时间 发生在你的类接收到消息之前,但是在它的超类接收到 initialize 之后。 举个例子,比如一个叫做 Duck 的类:

1. #import "Duck.h"; 2. 3. @implementation Duck 4. 5. +(void) initialize { 6. NSLog(@"Duck initialize"); 7. } 8. 9. -(void) init { 10. NSLog(@"Duck init"); 11. }

12. @end

我们在这里记录 initialize 和 init 调用的时间。 我们建立三个 Duck 对象的实例:

1. 2. 3. 4. 5.

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.] 2008-03-23 20:03:25.869 initialize_example[30253:10b] Hello, World! 2008-03-23 20:03:25.871 initialize_example[30253:10b] Duck initialize 2008-03-23 20:03:25.872 initialize_example[30253:10b] Duck init 2008-03-23 20:03:25.873 initialize_example[30253:10b] Duck init 2008-03-23 20:03:25.873 initialize_example[30253:10b] Duck init 我们可以看到,虽然我们创建了 3 个 Duck 的实例,但是 initialize 仅仅被调用 了一次。我们也可以看到,直到我们创建了一个 Duck 的实例,initialize 才被调 用。 但是如果 Duck 有一个子类的话, 比如我们建一个 Duck 的子类叫做 Chicken (好 怪异……): 1. 2. 3. 4. 5. 6. 7. #import <cocoa /Cocoa.h> #import "Duck.h" @interface Chicken : Duck { }

8. @end 9. </cocoa> 注意 Chicken 这个类并没有实现 initialize 方法。 如果我们同样运行这个程序,但是加上一个 Chicken 的实例:

1. NSLog(@"Hello, World!"); 2. 3. Duck* duck1 = [[Duck alloc] init]; 4. Duck* duck2 = [[Duck alloc] init]; 5. Duck* duck3 = [[Duck alloc] init]; 6. 7. Chicken* chicken = [[Chicken alloc] init]; 8. }

我们期待看到 4 个 Duck 的 init 调用 (因为我们建立了 3 个 Duck 和一个 Chicken) , 但是我们看到了这样情况: [Session started at 2008-03-23 20:13:34 -0400.] 2008-03-23 20:13:34.696 initialize_example[30408:10b] Hello, World! 2008-03-23 20:13:34.698 initialize_example[30408:10b] Duck initialize 2008-03-23 20:13:34.699 initialize_example[30408:10b] Duck init 2008-03-23 20:13:34.700 initialize_example[30408:10b] Duck init 2008-03-23 20:13:34.700 initialize_example[30408:10b] Duck init 2008-03-23 20:13:34.700 initialize_example[30408:10b] Duck initialize 2008-03-23 20:13:34.701 initialize_example[30408:10b] Duck init 我们看到了 4 个 Duck 的 init 和 2 个 Duck 的 initialize 方法。这是怎么回事呢? 看来如果一个子类没有实现 initialize 方法, 那么超类会调用这个方法两次, 一次 为自己,而一次为子类。 我们在 Duck 的 initialize 类中记录一下类名,这样可以看得更清楚:

1. +(void) initialize { 2. NSLog(@"Duck initialize class:%@", [self class]); 3. }

现在看明白了: [Session started at 2008-03-23 20:21:08 -0400.] 2008-03-23 20:21:08.816 initialize_example[30513:10b] Hello, World! 2008-03-23 20:21:08.818 initialize_example[30513:10b] Duck initialize class:Duck 2008-03-23 20:21:08.819 initialize_example[30513:10b] Duck init 2008-03-23 20:21:08.820 initialize_example[30513:10b] Duck init 2008-03-23 20:21:08.820 initialize_example[30513:10b] Duck init 2008-03-23 20:21:08.820 initialize_example[30513:10b] Duck initialize class:Chicken 2008-03-23 20:21:08.821 initialize_example[30513:10b] Duck init 如果你希望确定只用了 initialize 一次用来实现某些单独运行的工作, 或者希望实 现仅仅运行一次的方法,检查一下[self class],才能确定是否是你希望做到的效 果。

Objective-C 语法快速参考
大部分有一点其他平台开发基础的初学者看到 XCode, 第一感想是磨拳擦掌, 看 到 Interface Builder 之后,第一感想是跃跃欲试,而看到 Objective-C 的语法,第 一感想就变成就望而却步了。好吧,我是在说我自己。 如果你和我一样,对苹果相关的开发:Mac OS X 或是 iPhone 有兴趣,但是第一 时间看到 Objective-C 就会头疼并伴有发烧症状的话,疗效比较好的快速治疗方 法是阅读本文。 大概花二十分钟左右, 而且绝不无聊的时间, 你就会对 Objective-C 有那么一点点了解,至少读读例子不会那么头疼了。 不过假定你要有那么一点点 c++、c#或是 java 的基础,至少能看到 c++、c#或是 java 的源码,能够大致明白说得是什么。 这篇文章不是一篇科技文章,希望你也不要把它当做科技文章来读。文章非常不 严谨,但是我相信你能看得懂。

说的是几样东西? 一、XCode、Objective-C、Cocoa 说的是几样东西? 、 、 答案:三样东西。 答案:三样东西。 XCode:你可以把它看成是一个开发环境,就好像 Visual Studio 或者 Netbeans 或者 SharpDevelop 一样的玩意。你可以将 Interface Builder 认为是 Visual Studio 中用来画界面的那部分功能单独提出来的程序。 Objective-C:这是一种语言,就好像 c++是一种语言,Java 是一种语言,c#是一 种语言,莺歌历史也是一种语言一样。 Cocoa:是一大堆函数库,就好像 MFC、.NET、Swing 这类玩意,人家已经写好 了一堆现成的东西,你只要知道怎么用就可以了。 有些人会比较容易混淆 Objective-C 和 Cocoa, 就好像有些人会混淆 c#和.NET 一 样。这两个东西真的是两个不一样的东西。 是什么? 二、Objective-C 是什么? 你可以把它认为是语法稍稍有点不一样的 c 语言。 虽然第一眼望上去你可能会认 为它是火星语,和你所认知的任何一种语言都不一样。 先简单列出一点差别: 问题一:我在程序中看到大量的减号、中括号和 NS****这种东西,他们是什么 玩意儿?

1 减号(或者加号) 减号(或者加号) 减号表示一个函数、或者方法、或者消息的开始,怎么说都行。 比如 c#中,一个方法的写法可能是: private void hello(bool ishello) { //OOXX } 用 Objective-C 写出来就是 -(void) hello:(BOOL)ishello { //OOXX } 挺好懂的吧? 不过在 Objective-C 里面没有 public 和 private 的概念,你可以认为全是 public。 而用加号的意思就是其他函数可以直接调用这个类中的这个函数, 而不用创建这 个类的实例。 2 中括号 中括号可以认为是如何调用你刚才写的这个方法,通常在 Objective-C 里说“消 息”。 比如 C#里你可以这么写: this.hello(true); 在 Objective-C 里,就要写成: [self hello:YES]; 3 NS**** 老乔当年被人挤兑出苹果,自立门户的时候做了个公司叫做 NextStep,里面这 一整套开发包很是让一些科学家们喜欢,而现在 Mac OS 用的就是 NextStep 这 一套函数库。 这些开发 NextStep 的人们比较自恋地把函数库里面所有的类都用 NextStep 的 缩写打头命名,也就是 NS****了。比较常见的比如:

NSLog NSString NSInteger NSURL NSImage … 你会经常看到一些教学里面会用到: NSLog (@"%d",myInt); 这句话主要是在 console 里面跟踪使用, 你会在 console 里面看到 myInt 的值 (在 XCode 里面运行的时候打开 dbg 窗口即可看到)。而我们在其他开发环境里面 可能会比较习惯使用 MessageBox 这种方式进行调试。 你还可以看到其他名字打头的一些类,比如 CF、CA、CG、UI 等等,比如 CFStringTokenizer 这是个分词的东东 CALayer 这表示 Core Animation 的层 CGPoint 这表示一个点 UIImage 这表示 iPhone 里面的图片 CF 说的是 Core Foundation,CA 说的是 Core Animation,CG 说的是 Core Graphics,UI 说的是 iPhone 的 User Interface……还有很多别的,等你自己去 发掘了。 问题二、#import、@interface 这类玩意说的是什么? 1、#import 、 你可以把它认为是#include,一样的。但是最好用#import,记住这个就行了。 2、@interface 等等 、 比如你在 c#中写一个抓孩子类的定义: public class Kids : System { private string kidName=”mykid”; private string kidAge=“15”; private bool isCaughtKid() { return true; } }

当然,上面的写法不一定对,就是个用于看语法的举例。 在 Objective-C 里就得这么写: 先写一个 kids.h 文件定义这个类:

@interface Kids: NSObject { NSString *kidName; NSString *kidAge; } -(BOOL) isCaughtKid:; @end 再写一个 kids.m 文件实现: #import “kids.h” @implementation Kids -(void) init { kidName=@”mykid”; kidAge=@”15”; } -(BOOL) isCaughtKid:{ return YES; } @end 这个写法也不一定对,主要是看看语法就行了。-_-b 问题三、一个方法如何传递多个参数? 一个方法可以包含多个参数,不过后面的参数都要写名字。 多个参数的写法 (方法的数据类型) 函数名: (参数 1 数据类型) 参数 1 的数值的名字 参数 2 的名 字: (参数 2 数据类型) 参数 2 值的名字 …. ; 举个例子,一个方法的定义: -(void) setKids: (NSString *)myOldestKidName secondKid: (NSString *) mySecondOldestKidName thirdKid: (NSString *) myThirdOldestKidName;

实现这个函数的时候:

-(void) setKids: (NSString *)myOldestKidName secondKid: (NSString *) mySecondOldestKidName thirdKid: (NSString *) myThirdOldestKidName{ 大儿子 = myOldestKidName; 二儿子 = mySecondOldestKidName; 三儿子 = myThirdOldestKidName; } 调用的时候:

Kids *myKids = [[Kids alloc] init]; [myKids setKids: @”张大力” secondKid: @”张二力” thirdKid: @”张小力”]; 而如果你用 c#写这个方法,大致的写法可能是 public void setKids( string myOldestKidName, string mySecondOldestKidName, string myThirdOldestKidName) { … } 调用的时候大概的写法可能是: Kids myKids = new Kids(); myKids.setKids (“张大力”, “张二力”, “张小力”); 明白了吧?其实不怎么难看懂。 基本上,如果你能了解下面这段代码的转换关系,你 Objective-C 的语法也就懂 了八成了: [[[MyClass alloc] init:[foo bar]] autorelease]; 转换成 C#或者 Java 的语法也就是: MyClass.alloc().init(foo.bar()).autorelease(); 三、其他的一些东西

其实这些本站之前的文章有所提及,这里再详细解释一下。

1、 id: 、 : Objective-C 有一种比较特殊的数据类型是 id。你可以把它理解为“随便”。 在 Objective-C 里,一切东西都是指针形式保存,你获取到的就是这个对象在内 存的位置。那么 id 就是你知道这个位置,但是不知道里面是啥的时候的写法。 2、 同一个数组可以保存不同的对象: 、 同一个数组可以保存不同的对象 数组可以保存不同的对象: 比如一个数组 NSArray, 这种数组里面可以保存各种不同的对象, 比如这个数组 里: myArray <—-| 0: (float) 234.33f 1: @”我是个好人” 2: (NSImage *) 3: @”我真的是好人” (俺的美图)

这是一个由 4 个东西组成的数组, 这个数组包括一个浮点数, 两个字符串和一个 图片。 3、BOOL,YES,NO: 、 , , : 你可以认为 YES 表示 C#或者 Java 里的 true,NO 表示 false。而实际上 YES 是 1,NO 是 0,BOOL 本身就是个 char。 4、IBOutlet、IBAction 是啥玩意,总能看到。 、 是啥玩意,总能看到。 、 这两个东西其实在语法中没有太大的作用。如果你希望在 Interface Builder 中能 看到这个控件对象,那么在定义的时候前面加上 IBOutlet,在 IB 里就能看到这 个对象的 outlet, 如果你希望在 Interface Builder 里控制某个对象执行某些动作, 就在方法前面加上(IBAction)。 而这两个东西实际上和 void 是一样的。 5、nil。 、 。 Objective-C 里的 NULL(空)就这么写,表示空指针。 6、为什么是@”字符串 而不是 字符串 、为什么是 字符串 而不是”字符串 字符串”而不是 字符串” 前面加上@符号,编译器在编译的时候会在程序中给你留出位置,这样才能保证 这个字符串不会丢失。反正记住,如果你要想把某些字符串写死在程序里,就要 用@”字符串”,如果忘了用@,程序应该会出错。

superzhou 大侠指正: 6、为什么是@”字符串”而不是”字符串” ”字符串”是 C 的字符串,@”"是把 C 的字符串转成 NSString 的一个简写. 在需要 NSString 的地方才需要这个转化,例如 NSLog 里面. 在需要 C string 的地方,还是用”字符串”的. 另外,@”"这个转换是不支持中文的.例如 NSLog(@”字符串”); 是一定输出不了中 文的.

四、Objective-C 2.0 Objective-C 2.0 是 Leopard 新增加的一门语言, 其实和原来的 Objective-C 是一 样的。主要是增加了属性。详细的内容这里不写了,可以参阅 Allen Dang 的这 篇文章,写的很明白。 http://blog.codingmylife.com/?p=81

五、总结

现在来总结一下怎么看 Objective-C 的代码和怎么开始学 Objective-C 吧。 1、记住 Objective-C 就是 C,不是火星语,这个很关键。 2、记住你自己看不懂不表示脑子迟钝,大部分人第一次看 Objective-C 的代码 可能比你还要迟钝。 3、把 CocoaChina.com 加入收藏夹,看不明白代码就来再看一遍这篇开宗明义 的好文。 4、文档很关键,当你看不懂某些东西说的是什么的时候,先查 Cocoachina,再 看英文文档里面的 API 说明,尤其这个类是以 NS 开头的时候。再不行就去 google 搜,直接把你要查的方法贴进 google,通常能找到不少人也在问同样的 问题,自然也有热心人活雷锋帮助回答。 5、可以看 hello world 例子,但是不能总看,看多了真的会晕。另外,千万要放 弃苹果官方的 Currency Converter 货币转换的例子,那个例子是毒药,刚学的 时候越看越蒙。 6、学习一门语言最好的方法是先用,和学外语一样,当你会说的时候自然会读。 给自己设立一个简单的目标,比如做一个简单的程序,然后一点点解决问题。这 样学习起来比只看例子快得多。

这是一篇初学者写的文章,希望对同样是初学者的你有一点点帮助:)虽然只是 很肤浅的一点点内容,但是应该对你迈入 Objective-C 的大门有一点帮助。看懂 了这篇文章,回过头看 Cocoachina 的其他文章,你就会觉得很顺眼了。记得天 天来哦。 另外,这篇 Objective-C 的参考资料也比较好,如果你有兴趣可以一读。 http://www.otierney.net/objective-c.html.zh-tw.big5

从开发者观点看 iPhone SDK 升级到 Beta 3

苹果的 iPhone SDK 再次升级。同时旧的 iPhone 2.0 OS 固件到期,开发人员必须 升级到新的 iPhone 2.0 固件(Build 5A240d)。 最新的 iPhone SDK Beta 3 可以在这里下载(您必须有 ADC 帐户):

本文从开发者观点简单介绍这次升级苹果都提供了哪方面的更新。 这一版本的 iPhone SDK(主要是 XCode 和 Interface Builder)并没有给我们太多惊 喜,我们知道虽然 iPhone SDK Beta 2 就已经支持了 Interface Builder 制作 xib 界 面,但是期待中的 IB 与 XCode 的更好的整合并没有出现。也就是说我们还是必 须手动将 xib 和代码进行整合。 新的 Beta 3 中的说明只是非常简单的一行字:第三版 SDK 修改了一些 bug,并 支持最新的 iPhone OS 固件。 不过由于 iPhone OS 也从 2.0 的 beta 2 升级到了 beta 3,因此 API 有了一些变化, 主要体现在 Foundation、播放器以及 UIKit 中。具体变化可以查看以下说明: iPhone OS 2.0 Beta 2 至 Beta 3 升级说明 我们知道,在 iPhone SDK Beta 2 放出时,并没有提供关于如何整合 Interface Builder 到 XCode 中的详细说明,因此 Cocoachina 在当时提供了一个如何整合的

教学。在 Beta 3 放出的同时,文档也有了一点变化,苹果官方终于提供了一个如 何使用 Interface Builder 的教学。 苹果官方教学:你的第一个 iPhone 应用程序 这篇教学中介绍了使用 XCode 开发 iPhone 应用程序的基础知识、iPhone 开发的 设计模式、Interface Builder 的使用基础以及如何响应 iPhone 标准控件等知识。

这篇教学共包括以下内容: - 如何建立新项目 * XCode * 程序启动 * 设计模式 * 综述 - 添加 View Controller * 程序类 * 添加 View Controller 对象 * 界面源码 * 创建 View Controller 实例 * 设置 View * 整理代码

* 实现部分源码 * 综述 - 添加 Nib 文件 * Interface Builder 简介 * 创建 Nib 文件 * 配置 File’s Owner * 连接 View 的 outlet * 读入 Nib 文件 * 综述 - 配置 View * 添加界面元素 * View Controller 接口声明 * 综述 - 实现 View Controller * sayHello: 方法 * 文本框托管 * 释放 * 除错 * MyViewController 源码 * 综述 - 接下来该做的 这个教学虽然是英文,但是很浅显易懂,如果你对 iPhone 开发有兴趣,建议阅 读。


推荐相关:

Objective-C的Initialize初始化方法研究.doc

Objective-C的Initialize初始化方法研究_IT/计算机_专业资


objective-c中的构造函数(对象初始化)(七).pdf

objective-c中的构造函数(对象初始化)(七) - 本文由兰州中研白癜风研究所 http://wxjwbxg.com/收集,转载请注明出处 objective-c 中的构造函数(对象初...


C 初始化对象的方法总结.pdf

C 初始化对象的方法总结 - C++初始化对象的方法总结 原因: 最近在 objective-c 代码里要集成使用 c++第三方的类库,所以就接触了 c++初 始化对象的方法,下面...


《Objective-C基础教程》第5章.doc

Objective-C基础教程》第5章_调查/报告_表格/...我们不会去费力地研究真正的轮胎和发动机的 物理模型...首先是一个初始化实例变量的 init方法。init方法创建...


Objective-C程序设计.doc

Objective-C程序设计_计算机软件及应用_IT/计算机_...例如, 使用 alloc 和初始化方法创建一个对象时, ...(initialize) 等信息来推断应该在何处加入 retain/...


Object-C_2.0 学习笔记.doc

初始化类对象: 尽管类对象是由编译器创建的,但Objective-C仍然提供了一个让你初始化类对象的途径: initialize方法。如果类使用了上述所述的“仿类变量”机制,那么...


Objective-C程序设计基础复习知识点.doc

(共 10 小题) 应用题:50 分(共 4 小题) 考试范围: Objective-C 的基本语法、类的基本结构、继承、复合、内存管理、对象初始化、 属性、类别、协议、代码块...


Objective-C基础分析_图文.ppt

Objective-C基础分析_自考_成人教育_教育专区。Objective-C Object-C语言基础 一...[super dealloc]; } 在dealloc方法中对变量的释放顺序与初始化的顺序相 反,...


Objective-C 2.0程序设计 第10章-变量和数据类型_图文.ppt

数据类型转换 Objective-C 2.0程序设计 10.1 类的初始化前面已经出现过这种模式:使用以下常见序列,分配对象的新实例,然 后对它初始化: Fraction *myFract = [[...


Objective-C编码规范.pdf

方法名 o 变量名 ? 注释 o ?文件注释 o 声明注释 o 实现注释 o 对象所有权 ? Cocoa与Objective-C特性 o 成员变量应该为@private o 指明指定的初始化器 o...


从C++ 到 Objective-C(11):实例化(续二).doc

初始化列表和实例数据的默认值 Objective-C 中不存在 C++ 构造函数的初始化列表...事实上,如果子类没有定义 +(void) initialize;,那么 Objective-C 将 调用其父...


学习Objective-C入门教程(全).doc

学习Objective-C入门教程(全)_IT/计算机_专业...的初始化以及实例变量的作用域第8章,类方法...话“GarbageCollection”不大适合适初学者 研究...


Objective-C基础教程(中文版).doc

Objective-C基础教程(中文版)_IT/计算机_专业资料。IOS开发 Objective-C 本文主要介绍 Objective-C 的基本语法,传统的面向对象语言的封装,继承以及多态在 Objective-...


Objective-C学习笔记.doc

Objective-C学习笔记_计算机软件及应用_IT/计算机_专业资料。1,O-c 的 Hello ...OC 不要求构造函数名与类名相同,可以自定义任何名称的构造方法即初始 化方法,...


Objective-C编程全解(第3版)_附录A.doc

6 / 17 《Objective-C 编程全解》- 附录 A Foundation 框架的概要 NSCoding 定义了对类的实例进行归档化操作时需要实现的编码和解码方法 。协议定义在头文件 ...


简单讲解Objective-C的基本特性及其内存管理方式..doc

简单讲解 Objective-C 的基本特性及其内存管理方式 这篇文章主要介绍了简单讲解 Objective-C 的基本特性及其内存管理方式,虽然 Swift 语言出现后 iOS 和 Mac OS ...


基于Objective-C运行时系统的动态加载技术.pdf

Objective-C 语言的动态特性的研究不仅能提高编程的灵活性,还能大 大提升...因为插件模块可以在需要时才初始化,叫做懒加载; 4、主项目和插件项目可以并行...


关于Objective-C中Block的基本知识.pdf

关于Objective-C中Block的基本知识_计算机软件及应用_IT/计算机_专业资料。本文的...下面举一个前辈写的例子: //main.cpp int a = 0; // 全局初始化区 char...


01-Learning Objective-C A Primer.doc

运用这个符号和正常初始化的效果是一样的, 一个@符号紧跟两个双引号, 就像...在 Objective-C 中一个类可以定义两种类型的方法(函数):实例方法,类方法。一...


Learning Objective-C Primer 中文版.pdf

Learning Objective-C: A Primer (中文版) Objective-C 语言是一门简单的...从 NSMutableArray 继承,这个方法分配和初始化类的新实例并把它返回给你的代码...

网站首页 | 网站地图
All rights reserved Powered by 酷我资料网 koorio.com
copyright ©right 2014-2019。
文档资料库内容来自网络,如有侵犯请联系客服。zhit325@126.com