黑马程序员技术交流社区

标题: @interface和@implementation,对象创建 [打印本页]

作者: shenxian88    时间: 2015-4-29 23:33
标题: @interface和@implementation,对象创建
类的定义与实现[编辑]
Objective-C中强制要求将类的定义(interface)与实现(implementation)分为两个部分。

类的定义文件遵循C语言之惯例以.h为后缀,实现文件以.m为后缀。

Interface[编辑]
定义部分,清楚定义了类的名称、数据成员和方法。 以关键字@interface作为开始,@end作为结束。

@interface MyObject : NSObject {
    int memberVar1; // 实体变量
    id  memberVar2;
}

+(return_type) class_method; // 类方法

-(return_type) instance_method1; // 实例方法
-(return_type) instance_method2: (int) p1;
-(return_type) instance_method3: (int) p1 andPar: (int) p2;
@end
方法前面的 +/- 号代表函数的类型:加号(+)代表类方法(class method),不需要实例就可以调用,与C++ 的静态函数(static member function)相似。减号(-)即是一般的实例方法(instance method)。

这里提供了一份意义相近的C++语法对照,如下:

class MyObject : public NSObject {
protected:
    int memberVar1;  // 实体变量
    void * memberVar2;

  public:
    static return_type class_method(); // 類方法

    return_type instance_method1();    // 实例方法
    return_type instance_method2( int p1 );
    return_type instance_method3( int p1, int p2 );
}
Objective-C定义一个新的方法时,名称内的冒号(:)代表参数传递,不同于C语言以数学函数的括号来传递参数。Objective-C方法使得参数可以夹杂于名称中间,不必全部附缀于方法名称的尾端,可以提高程序可读性。设定颜色RGB值的方法为例:

- (void) setColorToRed: (float)red Green: (float)green Blue:(float)blue; /* 宣告方法*/

[myColor setColorToRed: 1.0 Green: 0.8 Blue: 0.2]; /* 呼叫方法*/
这个方法的签名是setColorToRed:Green:Blue:。每个冒号后面都带着一个float类别的参数,分别代表红,绿,蓝三色。

Implementation[编辑]
实现区段则包含了公开方法的实现,以及定义私有(private)变量及方法。 以关键字@implementation作为区段起头,@end结尾。

@implementation MyObject {
  int memberVar3; //私有實體變數
}

+(return_type) class_method {
    .... //method implementation
}
-(return_type) instance_method1 {
     ....
}
-(return_type) instance_method2: (int) p1 {
    ....
}
-(return_type) instance_method3: (int) p1 andPar: (int) p2 {
    ....
}
@end
值得一提的是不只Interface区段可定义实体变数,Implementation区段也可以定义实体变数,两者的差别在于访问权限的不同,Interface区段内的实体变数默认权限为protected,声明于implementation区段的实体变数则默认为private,故在Implementation区段定义私有成员更符合面向对象之封装原则,因为如此类之私有信息就不需曝露于公开interface(.h文件)中。

创建对象[编辑]
Objective-C创建对象需通过alloc以及init两个消息。alloc的作用是分配内存,init则是初始化对象。 init与alloc都是定义在NSObject里的方法,父对象收到这两个信息并做出正确回应后,新对象才创建完毕。以下为范例:

MyObject * my = [[MyObject alloc] init];
在Objective-C 2.0里,若创建对象不需要参数,则可直接使用new

MyObject * my = [MyObject new];
仅仅是语法上的精简,效果完全相同。

若要自己定义初始化的过程,可以重写init方法,来添加额外的工作。(用途类似C++ 的构造函数constructor)

- (id) init {
    if ( self=[super init] ) {   // 必须调用父类的init
        // do something here ...
    }
    return self;
}
作者: 许庭洲    时间: 2015-4-30 09:56
值得学习ing!
作者: hui1107464497    时间: 2015-5-24 17:33
多详细的。。
作者: aludiba    时间: 2015-7-1 01:05
牛逼啊!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2