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一样

posted on 2012-09-25 11:19  BankFish  阅读(335)  评论(0编辑  收藏  举报