objective-c中的构造函数(对象初始化)(七)
holydancer原创,如需转载,请在显要位置注明:
转自holydancer的CSDN专栏,原文地址:http://blog.csdn.net/holydancer/article/details/7354489
?
? ? ? ?以前我们创建对象时都是用new,从java过来的同学也都有这种习惯,其实objective-c中还有一种地道的创建对象的方法:[ [类名 alloc ] init].这种方法才是OC中创建对象的正统,不过效果和new是一样的,但是这种方法更能表示创建对象的实质,那就是分配内存,初始化对象。
alloc是在内存中划分一片空间,这片空间是一片处女地,然后呢,init初始化,我们可以在初始化的时候设置一些基本属性的值,这样就不用在创建对象后再调用方法来赋值。看代码:
human.h:
?
[plain]?view plaincopy?- #import?<Foundation/Foundation.h>??
- ??
- @interface?Human?:?NSObject??
- {??
- ????int?age;??
- ????NSString?*name;??
- }??
- -(void)setAge:(int)a?setName:(NSString?*)n;??
- -(int)age;??
- -(NSString?*)name;??
- @end??
human.m:
?
?
[plain]?view plaincopy?- #import?"Human.h"??
- ??
- @implementation?Human??
- -(id)init??
- {??
- ????if(self=[super?init])??
- ????{??
- ????????age=20;??
- ????????name=@"holy";??
- ????}??
- ????return?self;??
- }??
- -(void)setAge:(int)a?setName:(NSString?*)n??
- {??
- ????age=a;??
- ????[name?release];??
- ??????
- ????name=[n?copy];??
- }??
- -(int)age??
- {??
- ????return?age;??
- }??
- -(NSString?*)name??
- {??
- ????return?name;??
- }??
- @end??
main.m:
?
?
[plain]?view plaincopy?- #import?<Foundation/Foundation.h>??
- #import?"Human.h"??
- int?main(int?argc,?const?char?*?argv[])??
- {??
- ????NSAutoreleasePool?*pool;??
- ????pool?=[[NSAutoreleasePool?alloc]?init];??
- ??????
- ????Human?*?human?=?[[Human?alloc]?init];??
- ????NSLog(@"名字%@,年龄%d",[human?name],[human?age]);??
- ??????
- ????[human?setAge:100?setName:@"GOD"];??
- ????NSLog(@"名字%@,年龄%d",[human?name],[human?age]);??
- ??
- ????[human?release];??
- ????[pool?release];//相当于对池中每个对象执行了一次release;??
- ??????
- ??
- }??
?
?
上面的代码,在其中有一行这种初始化方法很好理解,但是有个缺点就是生成对象的默认属性值是固定的,如果想要修改的话需要再调用[plain]?view plaincopy?
- #import?<Foundation/Foundation.h>??
- ??
- @interface?Human?:?NSObject??
- {??
- ????int?age;??
- ????NSString?*name;??
- }??
- -(id)initWithAge:(int)a?Name:(NSString?*)n;??
- -(int)age;??
- -(NSString?*)name;??
- @end??
Human.m:
?
?
[plain]?view plaincopy?- #import?"Human.h"??
- ??
- @implementation?Human??
- -(id)init??
- {??
- ????if(self=[super?init])??
- ????{??
- ????????age=20;??
- ????????name=@"holy";??
- ????}??
- ????return?self;??
- }??
- -(id)initWithAge:(int)a?Name:(NSString?*)n??
- {??
- ????if?(self=[super?init])?{??
- ????????age=a;??
- ????????[name?release];??
- ??????????
- ????????name=[n?copy];??
- ????}??
- ????return?self;??
- ?????
- }??
- -(int)age??
- {??
- ????return?age;??
- }??
- -(NSString?*)name??
- {??
- ????return?name;??
- }??
- @end??
main.m:
?
?
[plain]?view plaincopy?- #import?<Foundation/Foundation.h>??
- #import?"Human.h"??
- int?main(int?argc,?const?char?*?argv[])??
- {??
- ????NSAutoreleasePool?*pool;??
- ????pool?=[[NSAutoreleasePool?alloc]?init];??
- ??????
- ????Human?*?human1?=?[[Human?alloc]?init];??
- ????NSLog(@"名字%@,年龄%d",[human1?name],[human1?age]);??
- ??????
- ????Human?*?human2?=?[[Human?alloc]?initWithAge:100?Name:@"GOD"];??
- ????NSLog(@"名字%@,年龄%d",[human2?name],[human2?age]);??
- ??????
- ??????
- ????[human1?release];??
- ????[human2?release];??
- ????[pool?release];//相当于对池中每个对象执行了一次release;??
- ??????
- ??
- }??
输出:
?
?
[plain]?view plaincopy?- 2012-03-14?21:03:24.974?String[460:403]?名字holy,年龄20??
- 2012-03-14?21:03:24.976?String[460:403]?名字GOD,年龄100??
- 关键字:objective-c?,objective?c?,?oc?,构造函数?,对象初始化?