收藏 分享(赏)

Object-C_经典入门教程.doc

上传人:HR专家 文档编号:6298239 上传时间:2019-04-05 格式:DOC 页数:76 大小:433.79KB
下载 相关 举报
Object-C_经典入门教程.doc_第1页
第1页 / 共76页
Object-C_经典入门教程.doc_第2页
第2页 / 共76页
Object-C_经典入门教程.doc_第3页
第3页 / 共76页
Object-C_经典入门教程.doc_第4页
第4页 / 共76页
Object-C_经典入门教程.doc_第5页
第5页 / 共76页
点击查看更多>>
资源描述

1、 Object-C 入门教程分类: Sipasterisk2009-05-04 16:34 16409人阅读 评论(2) 收藏 举报大纲o 开始吧下载这篇教学o 设定环境o 前言o 编译 hello worldo 创建 Classesinterfaceo implementationo 把它们凑在一起o 详细说明.多重参数o 建构子(Constructors)o 访问权限o Class level accesso 异常情况(Exceptions)处理o 继承、多型(Inheritance, Polymorphism)以及其他面向对象功能 id 型别o 继承(Inheritance)o 动态识别

2、(Dynamic types)o Categorieso Posingo Protocolso 内存管理 Retain and Release(保留与释放)o Dealloco Autorelease Poolo Foundation Framework ClassesNSArrayo NSDictionary 优点与缺点 更多信息开始吧下载这篇教学 所有这篇初学者指南的原始码都可以由 objc.tar.gz 下载。这篇教学中的许多范例都是由 Steve Kochan 在 Programming in Objective-C. 一书中撰写。如果你想得到更多详细信息及范例,请直接参考该书。这个网

3、站上登载的所有范例皆经过他的允许,所以请勿复制转载。设定环境 Linux/FreeBSD: 安装 GNUStep 为了编译 GNUstep 应用程序,必须先执行位于/usr/GNUstep/System/Makefiles/GNUstep.sh 的 GNUstep.sh 这个档案。这个路径取决于你的系统环境,有些是在 /usr, some /usr/lib,有些是/usr/local。如果你的 shell 是以 csh/tcsh 为基础的 shell,则应该改用 GNUStep.csh。建议把这个指令放在 .bashrc 或 .cshrc 中。 Mac OS X: 安装 XCode Windo

4、ws NT 5.X: 安装 cygwin 或 mingw,然后安装 GNUStep前言 这篇教学假设你已经有一些基本的 C 语言知识,包括 C 数据型别、什么是函式、什么是回传值、关于指针的知识以及基本的 C 语言内存管理。如果您没有这些背景知识,我非常建议你读一读 K) ,这是完全合法的,然而你却不能对 NULL 如法炮制。 BOOL:C 没有正式的布尔型别,而在 Objective-C 中也不是真的有。它是包含在 Foundation classes(基本类别库)中(即 import NSObject.h;nil 也是包括在这个头文件内) 。BOOL 在 Objective-C 中有两种型

5、态:YES 或 NO,而不是 TRUE 或 FALSE。 #import vs #include:就如同你在 hello world 范例中看到的,我们使用了#import。#import 由 gcc 编译程序支援。我并不建议使用 #include,#import 基本上跟 .h 档头尾的 #ifndef #define #endif 相同。许多程序员们都同意,使用这些东西这是十分愚蠢的。无论如何,使用 #import 就对了。这样不但可以避免麻烦,而且万一有一天 gcc 把它拿掉了,将会有足够的 Objective-C 程序员可以坚持保留它或是将它放回来。偷偷告诉你,Apple 在它们官方的

6、程序代码中也使用了 #import。所以万一有一天这种事真的发生,不难预料 Apple 将会提供一个支持 #import 的 gcc 分支版本。 在 Objective-C 中, method 及 message 这两个字是可以互换的。不过 messages 拥有特别的特性,一个 message 可以动态的转送给另一个对象。在 Objective-C 中,呼叫对象上的一个讯息并不一定表示对象真的会实作这个讯息,而是对象知道如何以某种方式去实作它,或是转送给知道如何实作的对象。编译 hello world hello.m #import int main( int argc, const cha

7、r *argv ) printf( “hello world/n“ ); return 0; o 输出hello world o 在 Objective-C 中使用 #import 代替 #include Objective-C 的预设扩展名是 .m创建 classesinterface 基于 “Programming in Objective-C,“ Copyright 2004 by Sams Publishing 一书中的范例,并经过允许而刊载。 Fraction.h #import interface Fraction: NSObject int numerator; int deno

8、minator; -(void) print; -(void) setNumerator: (int) d; -(void) setDenominator: (int) d; -(int) numerator; -(int) denominator; end o NSObject:NeXTStep Object 的缩写。因为它已经改名为 OpenStep,所以这在今天已经不是那么有意义了。 继承(inheritance)以 Class: Parent 表示,就像上面的 Fraction: NSObject。 夹在 interface Class: Parent 中的称为 instance va

9、riables。 没有设定访问权限(protected, public, private)时,预设的访问权限为 protected。设定权限的方式将在稍后说明。 Instance methods 跟在成员变数(即 instance variables)后。格式为:scope (returnType) methodName: (parameter1Type) parameter1Name;scope 有 class 或 instance 两种。instance methods 以 - 开头,class level methods 以 + 开头。 Interface 以一个 end 作为结束。im

10、plementation 基于 “Programming in Objective-C,“ Copyright 2004 by Sams Publishing 一书中的范例,并经过允许而刊载。 Fraction.m #import “Fraction.h“ #import implementation Fraction -(void) print printf( “%i/%i“, numerator, denominator ); -(void) setNumerator: (int) n numerator = n; -(void) setDenominator: (int) d denom

11、inator = d; -(int) denominator return denominator; -(int) numerator return numerator; end o Implementation 以 implementation ClassName 开始,以 end 结束。 Implement 定义好的 methods 的方式,跟在 interface 中宣告时很近似。把它们凑在一起 基于 “Programming in Objective-C,“ Copyright 2004 by Sams Publishing 一书中的范例,并经过允许而刊载。 main.m #impor

12、t #import “Fraction.h“ int main( int argc, const char *argv ) / create a new instance Fraction *frac = Fraction alloc init; / set the values frac setNumerator: 1; frac setDenominator: 3; / print it printf( “The fraction is: “ ); frac print; printf( “/n“ ); / free memory frac release; return 0; o out

13、putThe fraction is: 1/3 o Fraction *frac = Fraction alloc init;这行程序代码中有很多重要的东西。 在 Objective-C 中呼叫 methods 的方法是 object method,就像 C+的 object-method()。 Objective-C 没有 value 型别。所以没有像 C+ 的 Fraction frac; frac.print(); 这类的东西。在 Objective-C 中完全使用指针来处理对象。 这行程序代码实际上做了两件事: Fraction alloc 呼叫了 Fraction class 的 a

14、lloc method。这就像 malloc 内存,这个动作也做了一样的事情。 object init 是一个建构子(constructor)呼叫,负责初始化对象中的所有变量。它呼叫了 Fraction alloc 传回的 instance 上的 init method。这个动作非常普遍,所以通常以一行程序完成:Object *var = Object alloc init; frac setNumerator: 1 非常简单。它呼叫了 frac 上的 setNumerator method 并传入 1 为参数。 如同每个 C 的变体,Objective-C 也有一个用以释放内存的方式: re

15、lease。它继承自 NSObject,这个 method 在之后会有详尽的解说。详细说明.多重参数 目前为止我还没展示如何传递多个参数。这个语法乍看之下不是很直觉,不过它却是来自一个十分受欢迎的 Smalltalk 版本。 基于 “Programming in Objective-C,“ Copyright 2004 by Sams Publishing 一书中的范例,并经过允许而刊载。 Fraction.h . -(void) setNumerator: (int) n andDenominator: (int) d;. o Fraction.m . -(void) setNumerato

16、r: (int) n andDenominator: (int) d numerator = n; denominator = d; . o main.m #import #import “Fraction.h“ int main( int argc, const char *argv ) / create a new instance Fraction *frac = Fraction alloc init; Fraction *frac2 = Fraction alloc init; / set the values frac setNumerator: 1; frac setDenomi

17、nator: 3; / combined set frac2 setNumerator: 1 andDenominator: 5; / print it printf( “The fraction is: “ ); frac print; printf( “/n“ ); / print it printf( “Fraction 2 is: “ ); frac2 print; printf( “/n“ ); / free memory frac release; frac2 release; return 0; o output The fraction is: 1/3Fraction 2 is

18、: 1/5 o 这个 method 实际上叫做 setNumerator:andDenominator: 加入其他参数的方法就跟加入第二个时一样,即 method:label1:label2:label3:,而呼叫的方法是 obj method: param1 label1: param2 label2: param3 label3: param4 Labels 是非必要的,所以可以有一个像这样的 method:method:,简单的省略 label 名称,但以 : 区隔参数。并不建议这样使用。建构子(Constructors) 基于 “Programming in Objective-C,“

19、 Copyright 2004 by Sams Publishing 一书中的范例,并经过允许而刊载。 Fraction.h . -(Fraction*) initWithNumerator: (int) n denominator: (int) d;. o Fraction.m . -(Fraction*) initWithNumerator: (int) n denominator: (int) d self = super init; if ( self ) self setNumerator: n andDenominator: d; return self; . o main.m #

20、import #import “Fraction.h“ int main( int argc, const char *argv ) / create a new instance Fraction *frac = Fraction alloc init; Fraction *frac2 = Fraction alloc init; Fraction *frac3 = Fraction alloc initWithNumerator: 3 denominator: 10; / set the values frac setNumerator: 1; frac setDenominator: 3

21、; / combined set frac2 setNumerator: 1 andDenominator: 5; / print it printf( “The fraction is: “ ); frac print; printf( “/n“ ); printf( “Fraction 2 is: “ ); frac2 print; printf( “/n“ ); printf( “Fraction 3 is: “ ); frac3 print; printf( “/n“ ); / free memory frac release; frac2 release; frac3 release

22、; return 0; o output The fraction is: 1/3 Fraction 2 is: 1/5Fraction 3 is: 3/10 o interface 里的宣告就如同正常的函式。 implementation 使用了一个新的关键词:super如同 Java,Objective-C 只有一个 parent class(父类别) 。 使用 super init 来存取 Super constructor,这个动作需要适当的继承设计。 你将这个动作回传的 instance 指派给另一新个关键词:self。Self 很像 C+ 与 Java 的 this 指标。 if

23、( self ) 跟 ( self != nil ) 一样,是为了确定 super constructor 成功传回了一个新对象。nil 是 Objective-C 用来表达 C/C+ 中 NULL 的方式,可以引入 NSObject 来取得。 当你初始化变量以后,你用传回 self 的方式来传回自己的地址。 预设的建构子是 -(id) init。 技术上来说,Objective-C 中的建构子就是一个 “init“ method,而不像 C+ 与 Java 有特殊的结构。访问权限 预设的权限是 protected Java 实作的方式是在 methods 与变量前面加上 public/pri

24、vate/protected 修饰语,而 Objective-C 的作法则更像 C+ 对于 instance variable(译注:C+术语一般称为 data members)的方式。 Access.h #import interface Access: NSObject public int publicVar; private int privateVar; int privateVar2; protected int protectedVar; end o Access.m #import “Access.h“ implementation Accessend o main.m #im

25、port “Access.h“ #import int main( int argc, const char *argv ) Access *a = Access alloc init; / works a-publicVar = 5; printf( “public var: %i/n“, a-publicVar ); / doesnt compile /a-privateVar = 10; /printf( “private var: %i/n“, a-privateVar ); a release; return 0; o outputpublic var: 5 o 如同你所看到的,就像

26、 C+ 中 private: list of vars public: list of vars 的格式,它只是改成了private, protected, 等等。Class level access 当你想计算一个对象被 instance 几次时,通常有 class level variables 以及 class level functions 是件方便的事。 ClassA.h #import static int count; interface ClassA: NSObject +(int) initCount; +(void) initialize;end o ClassA.m #i

27、mport “ClassA.h“ implementation ClassA -(id) init self = super init; count+; return self; +(int) initCount return count; +(void) initialize count = 0; end o main.m #import “ClassA.h“ #import int main( int argc, const char *argv ) ClassA *c1 = ClassA alloc init; ClassA *c2 = ClassA alloc init; / prin

28、t count printf( “ClassA count: %i/n“, ClassA initCount ); ClassA *c3 = ClassA alloc init; / print count again printf( “ClassA count: %i/n“, ClassA initCount ); c1 release; c2 release; c3 release; return 0; o output ClassA count: 2ClassA count: 3 o static int count = 0; 这是 class variable 宣告的方式。其实这种变量

29、摆在这里并不理想,比较好的解法是像 Java 实作 static class variables 的方法。然而,它确实能用。 +(int) initCount; 这是回传 count 值的实际 method。请注意这细微的差别!这里在 type 前面不用减号 - 而改用加号 +。加号 + 表示这是一个 class level function。 (译注:许多文件中,class level functions 被称为 class functions 或 class method) 存取这个变数跟存取一般成员变数没有两样,就像 ClassA 中的 count+ 用法。 +(void) initia

30、lize method is 在 Objective-C 开始执行你的程序时被呼叫,而且它也被每个 class 呼叫。这是初始化像我们的 count 这类 class level variables 的好地方。异常情况(Exceptions) 注意:异常处理只有 Mac OS X 10.3 以上才支持。 基于 “Programming in Objective-C,“ Copyright 2004 by Sams Publishing 一书中的范例,并经过允许而刊载。 CupWarningException.h #import interface CupWarningException: NS

31、Exceptionend o CupWarningException.m #import “CupWarningException.h“ implementation CupWarningExceptionend o CupOverflowException.h #import interface CupOverflowException: NSExceptionend o CupOverflowException.m #import “CupOverflowException.h“ implementation CupOverflowExceptionend o Cup.h #import

32、interface Cup: NSObject int level; -(int) level; -(void) setLevel: (int) l; -(void) fill; -(void) empty; -(void) print;end o Cup.m #import “Cup.h“ #import “CupOverflowException.h“ #import “CupWarningException.h“ #import #import implementation Cup -(id) init self = super init; if ( self ) self setLev

33、el: 0; return self; -(int) level return level; -(void) setLevel: (int) l level = l; if ( level 100 ) / throw overflow NSException *e = CupOverflowException exceptionWithName: “CupOverflowException“ reason: “The level is above 100“ userInfo: nil; throw e; else if ( level = 50 ) / throw warning NSExce

34、ption *e = CupWarningException exceptionWithName: “CupWarningException“ reason: “The level is above or at 50“ userInfo: nil; throw e; else if ( level #import #import #import int main( int argc, const char *argv ) NSAutoreleasePool *pool = NSAutoreleasePool alloc init; Cup *cup = Cup alloc init; int

35、i; / this will work for ( i = 0; i interface Fraction: NSObject int numerator; int denominator; -(Fraction*) initWithNumerator: (int) n denominator: (int) d; -(void) print; -(void) setNumerator: (int) d; -(void) setDenominator: (int) d; -(void) setNumerator: (int) n andDenominator: (int) d; -(int) n

36、umerator; -(int) denominator;end o Fraction.m #import “Fraction.h“ #import implementation Fraction -(Fraction*) initWithNumerator: (int) n denominator: (int) d self = super init; if ( self ) self setNumerator: n andDenominator: d; return self; -(void) print printf( “%i / %i“, numerator, denominator

37、); -(void) setNumerator: (int) n numerator = n; -(void) setDenominator: (int) d denominator = d; -(void) setNumerator: (int) n andDenominator: (int) d numerator = n; denominator = d; -(int) denominator return denominator; -(int) numerator return numerator; end o Complex.h #import interface Complex:

38、NSObject double real; double imaginary; -(Complex*) initWithReal: (double) r andImaginary: (double) i; -(void) setReal: (double) r; -(void) setImaginary: (double) i; -(void) setReal: (double) r andImaginary: (double) i; -(double) real; -(double) imaginary; -(void) print; end o Complex.m #import “Com

39、plex.h“ #import implementation Complex -(Complex*) initWithReal: (double) r andImaginary: (double) i self = super init; if ( self ) self setReal: r andImaginary: i; return self; -(void) setReal: (double) r real = r; -(void) setImaginary: (double) i imaginary = i; -(void) setReal: (double) r andImagi

40、nary: (double) i real = r; imaginary = i; -(double) real return real; -(double) imaginary return imaginary; -(void) print printf( “%_f + %_fi“, real, imaginary ); end o main.m #import #import “Fraction.h“ #import “Complex.h“ int main( int argc, const char *argv ) / create a new instance Fraction *fr

41、ac = Fraction alloc initWithNumerator: 1 denominator: 10; Complex *comp = Complex alloc initWithReal: 10 andImaginary: 15; id number; / print fraction number = frac; printf( “The fraction is: “ ); number print; printf( “/n“ ); / print complex number = comp; printf( “The complex number is: “ ); numbe

42、r print; printf( “/n“ ); / free memory frac release; comp release; return 0; o output The fraction is: 1 / 10The complex number is: 10.000000 + 15.000000i o 这种动态链接有显而易见的好处。你不需要知道你呼叫 method 的那个东西是什么型别,如果这个对象对这个讯息有反应,那就会唤起这个 method。这也不会牵涉到一堆繁琐的转型动作,比如在 Java 里呼叫一个整数对象的 .intValue() 就得先转型,然后才能呼叫这个 method。继承(Inheritance) 基于 “Programming in Objective-C,“ Copyright 2004 by Sams Publishing 一书中的范例,并经过允许而刊载。 Rectangle.h #import interface Rectangle: NSObject int width; int height; -(Rectangle*) initWithWidth: (int) w height: (int) h; -(void) setWidth: (int) w; -(void) setHeight: (int) h;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 实用文档 > 简明教程

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报