Objective-C里面的特殊类型,用来指向对象类型,有点类似与c语言的(void *)。关键字nil用来表示c语言的null.
有了id,用户在调用一个对象的方法时,就可以不必知道这个对象具体是什么类型。实例如下:
1. 代码 :
//ClassA.h
#import <Foundation/NSObject.h>
@interface ClassA: NSObject
-(void) print;
@end
//ClassA.m
#import "ClassA.h"
@implementation ClassA
-(void) print {
printf( "this is ClassA\n");
}
@end
//ClassB.h
#import <Foundation/NSObject.h>
@interface ClassB: NSObject
-(void) print;
@end
//ClassB.m
#import "ClassB.h"
@implementation ClassB
-(void) print {
printf( "this is ClassB\n");
}
@end
//main.m
#import <stdio.h>
#import "ClassA.h"
#import "ClassB.h"
int main( int argc, const char *argv[] ) {
// create instance
ClassA *a = [[ClassA alloc] init];
ClassB *b = [[ClassB alloc] init];
id number;
// print
number = a;
[number print];
printf( "\n" );
// print
number = b;
[number print];
printf( "\n" );
}
2. 编译和运行:
gcc -fconstant-string-class=NSConstantString -c main.m -I /GNUstep/System/Library/Headers
gcc -c ClassA.m -I /GNUstep/System/Library/Headers
gcc -c ClassB.m -I /GNUstep/System/Library/Headers
gcc main.o ClassA.o ClassB.o -o main -L /GNUstep/System/Library/Libraries/ -lobjc -lgnustep-base
$ ./main.exe
this is ClassA
this is ClassB
3.说明 :
(1)系统总是能找到id的正确类型。
(2)这种方法和C++,java中的类型转换有异曲同工之妙,但是却是完全不同的概念和实现原理。
有了id,用户在调用一个对象的方法时,就可以不必知道这个对象具体是什么类型。实例如下:
1. 代码 :
//ClassA.h
#import <Foundation/NSObject.h>
@interface ClassA: NSObject
-(void) print;
@end
//ClassA.m
#import "ClassA.h"
@implementation ClassA
-(void) print {
printf( "this is ClassA\n");
}
@end
//ClassB.h
#import <Foundation/NSObject.h>
@interface ClassB: NSObject
-(void) print;
@end
//ClassB.m
#import "ClassB.h"
@implementation ClassB
-(void) print {
printf( "this is ClassB\n");
}
@end
//main.m
#import <stdio.h>
#import "ClassA.h"
#import "ClassB.h"
int main( int argc, const char *argv[] ) {
// create instance
ClassA *a = [[ClassA alloc] init];
ClassB *b = [[ClassB alloc] init];
id number;
number = a;
[number print];
printf( "\n" );
number = b;
[number print];
printf( "\n" );
}
2. 编译和运行:
gcc -fconstant-string-class=NSConstantString -c main.m -I /GNUstep/System/Library/Headers
gcc -c ClassA.m -I /GNUstep/System/Library/Headers
gcc -c ClassB.m -I /GNUstep/System/Library/Headers
gcc main.o ClassA.o ClassB.o -o main -L /GNUstep/System/Library/Libraries/ -lobjc -lgnustep-base
$ ./main.exe
this is ClassA
this is ClassB
3.说明 :
(1)系统总是能找到id的正确类型。
(2)这种方法和C++,java中的类型转换有异曲同工之妙,但是却是完全不同的概念和实现原理。