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:

 

#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:

 

 

#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:

 

 

#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:

 

#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:

 

 

#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:

 

 

#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;
    

}


输出:

 

 

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 ,构造函数 ,对象初始化 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值