Chapter 1 : 程序整体语法结构
1. Obj-C and C++概念对照:
-> Obj-C中的nil相当于NULL;
-> Obj-C中的YES和NO相当于true和false.
PS :Obj-C中的BOOL类型与C++中的不同:在C++里一切非0值的东西都为true,而0值的为false; 但在Obj-C里1为true并被宏定义为
YES, 0为false并被宏定义为NO。错误代码如下:
BOOL isDifferent(int int1, int int2) { return (int1 - int2); } if (isDifferent(4, 5) == YES) { // 因为isDifferent方法返回的是两个int的差,若差不为1的,则永远不会为YES }
2. 基本程序结构:
1 #import <Foundation/Foundation.h> 2 3 int main(int argc, char *argv[]) 4 { 5 // 在内存中加入一个“自动释放池”, 在释放内存池的时候也将同时释放池中的所有对象,对象加入pool的方法是发送[xx autorelease]消息 6 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 7 // 在控制台显示字串内容,类似于printf函数 8 NSLog(@"Programming is fun!"); 9 // 释放内存池 10 [pool drain]; 11 12 return 0; 13 }
3. 新类的定义(分为两个部分):
(1) @interface ... @end
描述类,类的数据成分及类的方法,格式如下
1 @interface NewClassName : ParentClassName 2 { 3 // 成员声明 4 memberDeclarations; 5 } 6 7 // 方法声明 8 methodDeclarations; 9 10 @end
(2) @implementation ... @end
实现类中定义方法的实际代码,格式如下:
// NewClassName表示的名称与@interface部分的类名相同 @implementation NewClassName methodDefinitions; @end
PS : 如果方法没有指定任何返回类型,那么默认是id类型,所有的输入参数默认也是id类型(id类型可用来引用任何类型的对象)。
一个简单的类定义示例:
// Fraction.h文件 #import <Foundation/Foundation.h> @interface Fraction : NSObject { int numerator; // 分子 int denominator; // 分母 } - (void)print; - (void)setNumerator:(int)n; - (void)setDenominator:(int)d; @end
// Fraction.m实现文件 @implementation Fraction - (void)print { NSLog(@"%i/%i", numerator, denominator); } - (void)setNumerator:(int)n { numerator = n; } - (void)setDenominator:(int)d { denominator = d; } @end
4. 对象实例化:
方法一:
Fraction *myFraction = [[Fraction alloc] init];
alloc消息 : 请求创建一个新实例;
init消息 : 初始化创建的实例对象。
方法二:
Fraction *myFraction = [Fraction new];
PS :通常使用方法一来实例化对象。
5. 外部访问实例变量:需要通过类的方法来检索其值,并不能直接访问。
示例代码:
// Rectangle.h文件 @interface Rectangle : NSObject { int width; // 宽度 int height; // 高度 } @property int width; @property int height; - (int)area; - (int)perimeter; - (void)setWidth:(int)w andHeight:(int)h; @end
// Rectangle.m文件 @implementation Rectangle @synthesize width; @synthesize height; - (void)setWidth:(int)w andHeight:(int)h { width = w; height = h; } - (int)area { return width * height; } - (int)perimeter { return (width + height) * 2; } @end
PS : 调用消息的类可以不知道如何响应消息。如果其不知道如何处理此消息,则会自动将消息转给父类,父类的父类..., 都没有找到即报错。
示例:
// Rectangle的子类Square // Square.h文件 #import "Rectangle.h" @interface Square : Rectangle - (int)side; - (void)setSide:(int)s; @end
// Square.m文件 #import "Square.h" @implementation Square : Rectangle - (int)side { return width; } - (void)setSide:(int)s { [self setWidth:s andHeight:s]; } @end
6. Obj-C与C语言兼容的地方:
-> 预处理 : #define语句和C一样
->#运算符 : #define str(x) #x
根据宏参数创建C风格的常量字串。例如: str("hello")将产生"\"hello\""
-> #import语句相当于#include语句,但是#import可自动防止同一个文件被导入多次
-> #条件编译语句(#ifdef, #endif, #else, #ifndef)和C一样
-> #undef语句,消除特定名称的定义
-> Array, function, pointer, struct, union的用法和C一样
-> 其它语句如do-while, while, for, if, if-else, switch, Boolean, goto, sizeof, 位操作符都和C一样