一、initWith带参的初始化
类型是(id),因为要返回self
- (id)initWith:(float)valueR
andPoint:(CenterPoint*)valueP
{
//第一步,判断参数的有效性。如果参数无效,先self release,然后返回nil。
if(nil==valueP||valueR<=0)
{
[self release];
return nil;
}
//第二步,调用父类的init初始化函数。如果父类没有init成功那么直接返回nil
这一步不需要self release,因为如果父类init不成功,父类就会释放自己
self=[super init];
if(nil==self)
{
return nil;
}
//第三步,成员变量申请空间并赋值。
_origin = [[CenterPoint alloc]init];
if(nil == _origin)
{
[self release];
return nil;
}
//注意这里要使用set函数赋值,因为成员变量是对象的指针
[_origin setAll:valueP._x andY:valueP._y andZ:valueP._z];
_radius = valueR;
//第四步,返回self
return self;
}
二、dealloc析构
类型是(void),不用return
- (void)dealloc
{
//if(_origin)
//if()写在这里纯粹是废话,二次删除的错误不是用if就可以避免的。Release只是释放了空间,但释放空间之后指针还是指向那块空间,这和C++中的delete是一样的。所以不论之前是否release了,指针都是真的,if都是会被执行的,除非我们已经自己把指针置为了nil。
[_origin release];
[super dealloc];//必须调用父类的dealloc函数。
}
三、description描述
类型是(NSString*)。
当使用@"%@"加上对象的时候,description会被自动调用。
- (NSString*)description
{
NSString*temp=[NSString stringWithFormat:@"%@,radius=%f",_origin,_radius];
return temp;
}
四、copy拷贝构造
类型是(id),和init一样,拷贝构造当然要返回self
- (id)copyWithZone:(NSZone *)zone
{
Circle *temp;
temp = [[[self class] allocWithZone:zone]initWith:self.radius andPoint:self.origin];
return temp;
}
五、encodeWithCoder编码
类型是(void),没有返回值
- (void)encodeWithCoder:(NSCoder *)coder //编码方法
{
//实例变量,加键值
[coder encodeObject:titleText forKey:SAMPLEDATA_KEY_TITLE];
[coder encodeInt:starCount forKey:@"star"];
}
initWithCoder解码
- (id)initWithCoder:(NSCoder *)decoder //解码方法
{
//创建临时对象
if ((self = [super init]))
{
//初始化临时对象的实例变量
self.titleText = nil;
//self.items = [[NSMutableDictionary alloc]init];
starCount = 0;
tempNumber = 0;
if (nil == decoder)
{
return self;
}
}
//解码,根据键值先判断
if ([decoder containsValueForKey:SAMPLEDATA_KEY_TITLE])
{
//根据键值进行解码
self.titleText = [decoder decodeObjectForKey:SAMPLEDATA_KEY_TITLE];
}
if ([decoder containsValueForKey:@"star"])
{
starCount = [decoder decodeIntForKey:@"star"];
}
//返回self
return self;
}