A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© f1gogo 中级黑马   /  2015-9-18 22:11  /  1127 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

这段时间,一直在抽时间学习oc,突然间在初始化这块有一点思考相与大家分享或者讨论。
先看一简单程序。
@interface Dog:NSObject
{
    int age;
}
-(void) setAge:(int *)newAge;
-(int) age;
@end;
//实现
@implementation Dog
-(void) setAge:(int *)newAge
{
    age=newAge;
}
-(int) age;
{
return age;
}
@end;
在main函数中,我们要实例化一个对象,然后调用set函数设置年龄。
第一句:Dog *dog=[[Don alloc] init];  
第二句:[dog setAge:5];
第一句,我们一般理解为,给对象分配空间并初始化(init),除指针外均置0 。age=0;
但第二句,同样也是在给dog这个对象的实例变量赋值,或者称为初始化,age=5。既然,我们在第二句的赋值对我们来讲是有意义的,那为什么还要在第一句里init置0呢,是否可以理解为多此一举。
换句话说,第一句只分配空间不就好嘛。Dog *dog=[Don alloc]; 接着,[dog setAge:5];
作为初学者,这个不能理解,希望多给指导。

6 个回复

倒序浏览
你的理解是这样做多此一举。你可以参考看构造函数的部分,其实对象有init方法,但是你没有写,所以显然你在init的时候调用的是从NSObject继承来的默认初始化方法,这个方法没有参数,所以整型默认赋值为0。事实上,你可以自己重写init方法,比如-(void) initWithAge:(int *)age{if(self[super init]
回复 使用道具 举报

你的理解是这样做多此一举。
你可以参考看构造函数的部分,其实对象有init方法,但是你没有写,所以显然你在init的时候调用的是从NSObject继承来的默认初始化方法,这个方法没有参数,所以整型默认赋值为0。
事实上,你可以自己重写init方法,比如
-(void) initWithAge:(int *)age{
if(self==[super init])
[self.age=age];
}
初始化写法:
[[Dog alloc] initWithAge:5];
回复 使用道具 举报
第二句已经不能叫做初始化了,只是单纯的赋值
至于为什么要初始化,如果你定义的成员变量中有指针,不初始化赋值为NULL的话,直接使用可能就成了一个野指针,不安全。
回复 使用道具 举报
不错不错
回复 使用道具 举报
确实有一点
回复 使用道具 举报
摆摆 中级黑马 2015-9-20 12:15:48
7#
学习了!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马