以前我们创建对象时都是用new,从java过来的同学也都有这种习惯,其实objective-c中还有一种地道的创建对象的方法:[ [类名 alloc ] init].这种方法才是OC中创建对象的正统,不过效果和new是一样的,但是这种方法更能表示创建对象的实质,那就是分配内存,初始化对象。

alloc是在内存中划分一片空间,这片空间是一片处女地,然后呢,init初始化,我们可以在初始化的时候设置一些基本属性的值,这样就不用在创建对象后再调用方法来赋值。看代码:

human.h:

 



[plain]  view plain copy

 


1. #import <Foundation/Foundation.h>  
2.   
3. @interface Human : NSObject  
4. {  
5.     int age;  
6.     NSString *name;  
7. }  
8. -(void)setAge:(int)a setName:(NSString *)n;  
9. -(int)age;  
10. -(NSString *)name;  
11. @end


human.m:

 

 



[plain]  view plain copy

 



1. #import "Human.h"  
2.   
3. @implementation Human  
4. -(id)init  
5. {  
6.     if(self=[super init])  
7.     {  
8.         age=20;  
9.         name=@"holy";  
10.     }  
11.     return self;  
12. }  
13. -(void)setAge:(int)a setName:(NSString *)n  
14. {  
15.     age=a;  
16.     [name release];  
17.       
18.     name=[n copy];  
19. }  
20. -(int)age  
21. {  
22.     return age;  
23. }  
24. -(NSString *)name  
25. {  
26.     return name;  
27. }  
28. @end



main.m:

 

 



[plain]  view plain copy

 


1. #import <Foundation/Foundation.h>  
2. #import "Human.h"  
3. int main(int argc, const char * argv[])  
4. {  
5.     NSAutoreleasePool *pool;  
6.     pool =[[NSAutoreleasePool alloc] init];  
7.       
8.     Human * human = [[Human alloc] init];  
9.     NSLog(@"名字%@,年龄%d",[human name],[human age]);  
10.       
11.     [human setAge:100 setName:@"GOD"];  
12.     NSLog(@"名字%@,年龄%d",[human name],[human age]);  
13.   
14.     [human release];  
15.     [pool release];//相当于对池中每个对象执行了一次release;  
16.       
17.   
18. }



 

 

上面的代码,在human类中有一个init方法,继承于NSObject类中,不用在human.h文件中声明,也可以不写,如果要设置默认的属性,就可以重写init方法,在里面进行对象的初始化,然后呢生成出来的对象就会有自己的默认属性值了。

其中有一行 if(self=[super init]) 这行代码主要是为了防止父类初始化失败,如果父类初始化失败了,会返回一个nil值,虽然可能性很小

这种初始化方法很好理解,但是有个缺点就是生成对象的默认属性值是固定的,如果想要修改的话需要再调用set方法,那么有没有可以在生成对象的时候自定义属性值的方法呢?既然这样说了,肯定是有的嘛,吼吼,请看代码:

Human.h:

 



[plain]  view plain copy

 


1. #import <Foundation/Foundation.h>  
2.   
3. @interface Human : NSObject  
4. {  
5.     int age;  
6.     NSString *name;  
7. }  
8. -(id)initWithAge:(int)a Name:(NSString *)n;  
9. -(int)age;  
10. -(NSString *)name;  
11. @end



Human.m:

 

 



[plain]  view plain copy

 



1. #import "Human.h"  
2.   
3. @implementation Human  
4. -(id)init  
5. {  
6.     if(self=[super init])  
7.     {  
8.         age=20;  
9.         name=@"holy";  
10.     }  
11.     return self;  
12. }  
13. -(id)initWithAge:(int)a Name:(NSString *)n  
14. {  
15.     if (self=[super init]) {  
16.         age=a;  
17.         [name release];  
18.           
19.         name=[n copy];  
20.     }  
21.     return self;  
22.      
23. }  
24. -(int)age  
25. {  
26.     return age;  
27. }  
28. -(NSString *)name  
29. {  
30.     return name;  
31. }  
32. @end



main.m:

 

 



[plain]  view plain copy

 



1. #import <Foundation/Foundation.h>  
2. #import "Human.h"  
3. int main(int argc, const char * argv[])  
4. {  
5.     NSAutoreleasePool *pool;  
6.     pool =[[NSAutoreleasePool alloc] init];  
7.       
8.     Human * human1 = [[Human alloc] init];  
9.     NSLog(@"名字%@,年龄%d",[human1 name],[human1 age]);  
10.       
11.     Human * human2 = [[Human alloc] initWithAge:100 Name:@"GOD"];  
12.     NSLog(@"名字%@,年龄%d",[human2 name],[human2 age]);  
13.       
14.       
15.     [human1 release];  
16.     [human2 release];  
17.     [pool release];//相当于对池中每个对象执行了一次release;  
18.       
19.   
20. }



输出:

 

 



[plain]  view plain copy

 



  1. 2012-03-14 21:03:24.974 String[460:403] 名字holy,年龄20  
  2. 2012-03-14 21:03:24.976 String[460:403] 名字GOD,年龄100