objective-c中的构造函数(对象初始化)(七)

    xiaoxiao2025-04-17  9

    holydancer原创,如需转载,请在显要位置注明:

    转自holydancer的专栏,原文地址:http://blog.csdn.net/holydancer/article/details/7354489

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

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

    human.h:

    [plain]  view plain  copy #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 plain  copy #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 plain  copy #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;             }  

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

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

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

    Human.h:

    [plain]  view plain  copy #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 plain  copy #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 plain  copy #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 plain  copy 2012-03-14 21:03:24.974 String[460:403] 名字holy,年龄20   2012-03-14 21:03:24.976 String[460:403] 名字GOD,年龄100  

    转载请注明原文地址: https://ju.6miu.com/read-1298148.html
    最新回复(0)