《Objective-C 2.0程序设计》摘要

1. 命令行下编译

可以使用名为gcc的GNU Objective-C编译器来编译并链接这个程序,gcc命令一般的格式为:
gcc -framework Foundation files -o progname
该选项说明你要使用有关Foundation框架的信息:
-framework Foundation

2. 语法

Objective-C是区分大小写的

Obj-C采用特定的语法对类和实例应用方法:[ClassOrInstance Method]
在这条语句中,左方括号要紧跟类的名称或该类的实例的名称,它后面可以是一个或者多个空格,空格后面是将要执行的方法。请求一个类或者实例来执行某个操作时,就是在向它发送一条消息。因此也可以表示为:
[receiver message]

 

@interface定义的方法中,开头的负号(-)通知Obj-C编译器,该方法是一个实例方法。其他唯一的选择是正号(+) 。类方法是对类本身执行某些操作的方法。

Apple的运行时系统提供了一个称为垃圾回收的机制,它可自动清理内存。但是,最好要学会如何自己管理内存的使用,而不是依赖于自动的机制。事实上,针对不支持垃圾回收的某些平台,如iphone进行程序设计时,就不能依赖与垃圾回收机制。

使用@property和@synthesize来自动生成设置函数方法和获取函数方法。

关键字self用来指明对象是当前方法的接收者。类似c++的this

@class,使用@class关键字声明一个类,提高了效率,因为编译器不需要处理整个类.h文件;而只需要xxx是个类名字。如果需要引用xxx类中的方法,@class指令是不够的,因为编译器需要更多的信息。需要知道该方法中有多少参数,它们是什么类型,方法的返回类型是什么。

关键字super,用来引用消息接收者的父类。

@selector(alloc) 为名为alloc的方法声称一个SEL类型的值。要确定对象是否可以响应这个动作,可以使用respondsToSelector。

@try, @catch(NSException), @throw, @finally [exception name] [exception reason]

接口中可以声明@protected(这个指令后面的实例变量可被该类及任何子类中定义的方法直接访问,这是默认的情况); @private (可被定义的类的方法直接访问,但是不能被子类中定义的方法直接访问);@public(可被该类定义的方法直接访问,也可被其他类或模块中定义的方法直接访问,使得其他方法或函数可以通过使用指针运算符->访问实例变量);@package(对于64位图像,可以在实现该类的图像的任何地方访问这个实例变量)

3. 继承

有时,创建类只是使创建子类更容易。因此,这些类名为抽象类。例如Foundation的NSNumber类是为了将数字作为对象处理而创建的抽象类。整数和浮点数字通常有不同的内存需求。每种数字类型都有单独的NSNumber子类。因为这些子类属于NSNumber类,总起来名为簇(cluster)。向NSNumber类发送消息来创建新的整数对象时,使用合适的子类为整数对象分配必需的空间,并正确的设定其值。这些子类实际上是私有的。你自己无法直接访问这些子类,只能通过抽象的超类间接访问。

4. Category

分类(Category)提供了一个方式,用它可以将类的定义模块化到相关方法的组或者分类中。它还提供了扩展现有类定义的简便方式,并且不必访问类的源代码,也无需创建子类。

关于分类有几点值得注意,首先,尽管分类可以访问原始类的实例,变量,但是它不能添加自身的任何变量,如果需要添加变量,可以考虑创建子类;另外,分类可以重载该类中的另一个方法,但是通常认为这种做法是拙劣的设计习惯。其一,重载了一个方法以后,再也不能访问原来的方法。因此,必须小心地将被重载方法中的所有功能复制到替换方法中。如果确实需要重载方法,正确的选择可能是创建子类。如果在子类中重载方法,仍然可以通过向super发送消息来引用父类的方法;和一般接口方法不同的是,不必实现分类中的所有方法。这对于程序扩展很有用,因为可以在该分类中声明所有方法,然后在一段时间之后才实现它。

5. Protocol

协议(protocol)是多个类共享的一个方法列表。协议中列出的方法没有相应的实现。如果定义了自己的协议,则不必由自己实际实现它。但是,这就告诉其他程序员:如果要采用这项协议,则必须实现这些方法。这些方法可以从超类继承;可以在@protocol中使用@optional指令,下面列出的所有方法的指令都是可选的,之后可以在协议内定义@required指令来列出需要的方法。

可以使用conformsToProtocol方法检查一个对象是否遵循某项协议;定义一项协议时,可以扩展现有协议的定义,所以以下协议定义:
@protocol Drawing3D <Drawing>
说明Drawing3D协议也采用了Drawing协议。因此,任何采用Drawing3D协议的类都必须实现此协议列出的方法

分类也可以采用一项协议,如:@interface Fraction (Stuff) <NSCopying, NSCoding>

非正式协议实际上仅仅是一个名称之下的一组方法。前面描述的@optional指令添加到了Obj-C 2.0语言中,用于取代非正式协议的使用。

6. id类型

id类型是一种通用的对象类型。为什么不把所有的对象都声明为id类型呢?使用静态类型时,编译器尽可能确保变量的用法在程序中始终保持一致。编译器通过检查来确定应用于对象的方法是由该类定义的或者由该类继承,否则它显示警告信息。静态类型是因为它能更好地在程序编译阶段而不是在运行时指出错误。使用静态类型的另一个原因是它能够提高程序的可读性。

id类型是通用指针类型:因为通过指针,也就是内存地址来引用对象,所以可以自由地将它们在id变量之间来回赋值。因此返回id类型值的方法只是返回指向内存中某对象的指针。然后可以将该值赋给任何对象变量。因为无论在哪里,对象总是携带它的isa成员,所以即使将它存储在id类型的通用对象变量中,也总是可以确定它的类。

7. Cocoa & Cocoa Touch

Application Kit框架包括广泛的类和方法,它们用来开发交互式图形应用程序,使得开发文本/菜单/工具栏/表/文档/剪贴板和窗口之类的过程变得十分简便。在Mac OSX操作系统中,术语cocoa总的来说指的是Foudation框架和AppKit框架。术语Cocoa Touch是指Foudation框架和UIKit框架。

8. 内存管理

自动释放池可以自动释放添加到该池中的对象所使用的内存。向对象发送一条autorelease消息时,就将该对象放到这个池中。释放这个池时,添加到该池的所有对象也会一起释放。

当对象的引用计数达到0时,系统就知道不再需要这个对象,因此系统就会释放它的内存,这是通过向对象发送一条dealloc消息而实现的。

通过向对象发送retainCount消息,可以获得这个对象的引用计数。

如果你的方法中不再需要一个对象,但需要返回它,那么向其发送一条autorelease消息,将它标记为以后释放。消息autorelease并不影响对象的引用计数。因此它允许消息的发送者使用这个对象,然后仍然在以后当自动释放池时,释放这些对象。

如果使用alloc或者copy方法(或使用allocWithZone,copyWithZone或mutableCopy方法)直接创建对象,则由你负责释放它。每次retain对象时,应该release或者autorelease它。

译者序 作者简介 技术审校人员简介 第1章 前言 1.1 本书的内容 1.2 本书的组织方式 1.3 致谢 第1部分 Objective-C语言 第2章 Objective-C程序设计 2.1 编译并运行程序 2.1.1 使用Xcode 2.1.2 使用Terminal 2.2 解释第一个程序 2.3 显示变量的值 2.4 小结 2.5 练习 第3章 类、对象和方法 3.1 到底什么是对象 3.2 实例和方法 3.3 用于处理分数的Objective-C类 3.4 @interface部分 3.4.1 选择名称 3.4.2 实例变量 3.4.3 类和实例方法 3.5 @implementation部分 3.6 Program部分 3.7 实例变量的访问以及数据封装 3.8 小结 3.9 练习 第4章 数据类型和表达式 4.1 数据类型和常量 4.1.1 int类型 4.1.2 float类型 4.1.3 double类型 4.1.4 char类型 4.1.5 限定词:long、long long、short、unsigned及signed 4.1.6 id类型 4.2 算术表达式 4.2.1 运算符的优先级 4.2.2 整数运算和一元负号运算符 4.2.3 模运算符 4.2.4 整型值和浮点值的相互转换 4.2.5 类型转换运算符 4.3 赋值运算符 4.4 计算器类 4.5 位运算符 4.5.1 按位与运算符 4.5.2 按位或运算符 4.5.3 按位异或运算符 4.5.4 一次求反运算符 4.5.5 向左移位运算符 4.5.6 向右移位运算符 4.6 类型:_Bool、_Complex和_Imaginary 4.7 练习 第5章 循环结构 5.1 for语句 5.1.1 键盘输入 5.1.2 嵌套的for循环 5.1.3 for循环的变形 5.2 while语句 5.3 do语句 5.4 break语句 5.5 continue语句 5.6 小结 5.7 练习 第6章 选择结构 6.1 if语句 6.1.1 if-else结构 6.1.2 复合条件测试 6.1.3 嵌套的if语句 6.1.4 else if结构 6.2 switch语句 6.3 Boolean变量 6.4 条件运算符 6.5 练习 第7章 类 7.1 分离接口和实现文件 7.2 合成存取器方法 7.3 使用点运算符访问属性 7.4 具有多个参数的方法 7.4.1 不带参数名的方法 7.4.2 关于分数的操作 7.5 局部变量 7.5.1 方法的参数 7.5.2 static关键字 7.6 self关键字 7.7 在方法中分配和返回对象 7.8 练习.. 第8章 继承 8.1 一切从根类开始 8.2 通过继承扩展—添加新方法 8.2.1 Point类和内存分配 8.2.2 @class指令 8.2.3 具有对象的类 8.3 重载方法 8.3.1 择哪个方法 8.3.2 重载dealloc方法和关键字super 8.4 通过继承扩展:添加新的实例变量 8.5 抽象类 8.6 练习 第9章 多态、动态类型和动态绑定 9.1 多态:相同的名称,不同的类 9.2 动态绑定和id类型 9.3 编译时和运行时检查 9.4 id数据类型与静态类型 9.5 有关类的问题 9.6 使用@try处理异常 9.7 练习 第10章 变量和数据类型 10.1 类的初始化 10.2 作用域回顾 10.2.1 控制实例变量作用域的指令 10.2.2 外部变量 10.2.3 静态变量 10.3 存储类说明符 10.3.1 auto 10.3.2 const 10.3.3 volatile 10.4 枚举数据类型 10.5 typedef语句 10.6 数据类型转换 10.6.1 转换规则 10.6.2 符号扩展 10.7 练习 第11章 分类和协议 11.1 分类 11.2 协议 11.3 合成对象 11.4 练习 第12章 预处理程序 12.1 #define语句 12.1.1 更高级的定义类型 12.1.2 #运算符 12.1.3 ##运算符 12.2 #import语句 12.3 条件编译 12.3.1 #ifdef、#endif、#else和#ifndef语句 12.3.2 #if和#elif预处理程序语句 12.3.3 #undef语句 12.4 练习 第13章 基本的C语言特性 13.1 数组 13.1.1 数组元素的初始化 13.1.2 字符数组 13.1.3 多维数组 13.2 函数 13.2.1 参数和局部变量 13.2.2 函数的返回结果 13.2.3 函数、方法和数组 13.3 结构 13.3.1 结构的初始化 13.3.2 结构数组 13.3.3 结构中的结构 13.3.4 关于结构的补充细节 13.3.5 不要忘记面向对象编程思想 13.4 指针 13.4.1 指针和结构 13.4.2 指针、方法和函数 13.4.3 指针和数组 13.4.4 指针运算 13.4.5 指针和内存地址 13.5 联合 13.6 它们不是对象 13.7 其他语言特性 13.7.1 Compound Literal 13.7.2 goto语句 13.7.3 空语句 13.7.4 逗号运算符 13.7.5 sizeof运算符 13.7.6 命令行参数 13.8 工作原理 事实#1:实例变量存储在结构中 事实#2:对象变量实际上是指针 事实#3:方法是函数,而消息表达式是 函数调用 事实#4:id类型是通用指针类型 13.9 练习 第二部分 Foundation框架 第14章 Foundation框架简介 第15章 数字、字符串和集合 15.1 数字对象 15.2 字符串对象 15.2.1 NSLog函数 15.2.2 可变对象与不可变对象 15.2.3 可变字符串 15.2.4 所有对象到哪里去了 15.3 数组对象 15.4 同步AddressCard方法 15.4.1 快速枚举 15.4.2 数组排序 15.5 词典对象 15.6 集合对象 15.7 练习 第16章 使用文件 16.1 管理文件和目录:NSFileManager 16.1.1 使用NSData类 16.1.2 使用目录 16.1.3 枚举目录中的内容 16.2 使用路径:NSPathUtilities.h 16.2.1 常用的路径处理方法 16.2.2 复制文件和使用NSProcessInfo类 16.3 基本的文件操作:NSFileHandle 16.4 练习 第17章 内存管理 17.1 自动释放池 17.2 引用计数 17.2.1 引用计数和字符串 17.2.2 引用计数与实例变量 17.3 自动释放池示例 17.4 内存管理规则摘要 17.5 垃圾回收 17.6 练习 第18章 复制对象 18.1 copy和mutableCopy方法 18.2 浅复制与深复制 18.3 实现协议 18.4 用赋值方法和取值方法复制对象 18.5 练习 第19章 归档 19.1 使用XML属性列表进行归档 19.2 使用NSKeyedArchiver归档 19.3 编码方法和解码方法 19.4 使用NSData创建自定义档案 19.5 使用归档程序复制对象 19.6 练习 第三部分 Cocoa和iPhone SDK 第20章 Cocoa简介 20.1 框架层 20.2 接触Cocoa 第21章 编写iPhone应用程序 21.1 iPhone SDK 21.2 第一个iPhone应用程序 21.2.1 创建新的iPhone应用程序项目 21.2.2 输入代码 21.2.3 设计界面 21.3 iPhone分数计算器 21.3.1 启动新的Fraction_Calculator项目 21.3.2 定义视图控制器 21.3.3 Fraction类 21.3.4 处理分数的Calculator类 21.3.5 设计UI 21.4 小结 21.5 练习 第四部分 附录 附录A 术语表 附录B Objective-C 2.0语言概览 附录C 地址簿源代码 附录D 资源
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值