@interface Box:NSObject { int l; int w; } -(void)print; -(void)set_l:(int)x; //set box.length -(void)set_w:(int)x; //set box.width -(int) l; -(int) w; @end @implementation Box
/*{
int l;
int w;
} 如果前面没有,则这里不能有实例变量声明吗?,否则会出错 error: inconsistent number of instance variables specified*/ -(void)print{ NSLog(@"l:%d,w:%d",l,w); } -(void)set_l:(int)x{ l=x; } -(void)set_w:(int)x{ w=x; } -(int)l{ return l; } -(int)w{ return w; } @end int main(int argc, char *argv[]){ NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; @autoreleasepool { NSLog(@"hello class! :)"); Box *box0 = [Box new]; Box *box1 = [[Box alloc] init]; //new类方法的"分开步骤写法" [box0 set_l:1]; [box0 set_w:2]; [box1 set_l:101]; [box1 set_w:102]; NSLog(@"box0: l is %d , w is %d",[box0 l],[box0 w]); NSLog(@"box1:"); [box1 print]; } NSLog(@"Hello World!"); [pool drain]; return 0; }
[2014-06-30 第1次添加内容:定制对象的init方法]:
为了更好地初始化对象的变量,为什么不在对象init方法中就对其变量赋值呢?当然可以哦,以下是修改过的A类,在其添加了新的init:(int)方法,并且重载了原有的方法。在新的init:(int)方法中,我们首先要调用父类中的init方法,在其成功后(返回非nil值),才做自己初始化,另外注意init返回的都是id变量:
#import <Foundation/Foundation.h> @interface A:NSObject @property int i; -(void)set_i:(int)i; -(void)print; -(id)init:(int)x; @end @implementation A{ int i; } @synthesize i; -(void)set_i:(int)i_v{ i = i_v; } -(void)print{ NSLog(@"[class A][i:%d]:hello!",i); } -(id)init:(int)x{ self = [super init]; if(self){ [self set_i:x]; } return self; } -(id)init{ return [self init:0]; } @end @interface B:A{ int j; } @property int j; @end @implementation B @synthesize j; -(void)print{ NSLog(@"[class B:A][i:%d,j:%d]hello!",self.i,j); } @end int main(int argc,char *argv[]) { @autoreleasepool{ NSLog(@"hello obj-c!"); A *a = [[A alloc] init:100]; B *b = [[B alloc] init:200]; //a.i = 101; //b.i = 1001; //[a set_i:99]; //[b set_i:199]; //b.j = 1002; [a print]; [b print]; } return 0; }
注意,obj-c中的#import和C中的#include类似,不同的是#import保证只加载一次h文件哦。@开头的字面值称为obj-c的关键字,为了和C代码冲突最小化,遂在开头加上字符@。