您的位置:首页 > 移动开发 > Objective-C

[ObjectC]Objective-C内存管理之---属性修饰词

2016-05-25 14:46 441 查看
iOS经典面试题总结--内存管理 :

分别写一个setter方法用于完成@property (nonatomic,retain)NSString *name和@property (nonatomic,copy) NSString *name
-(void)setName:(NSString *)name
{
[name retain];
[_name release];
_name = name;
}
-(void)setName:(NSString *)name
{
[_name release];
_name = [name copy];
}
retain属性的setter方法是保留新值并释放旧值,然后更新实例变量,令其指向新值。顺序很重要。假如还未保留新值就先把旧值释放了,而且两个值又指向同一个对象,先执行的release操作就可能导致系统将此对象永久回收。

当把属性的语义特性分别声明为assign,retain,copy时, 自动生成setter, getter方法内部实现

假定有一个车类Car.h中定义三个属性
@property (nonatomic, retain) NSString * brand; //品牌
@property (nonatomic, copy) NSString * colour;  //颜色
@property (nonatomic, assign) CGFloat  price;   //价格
以下是把属性的语义特性分别声明为assign,retain,copy时, 自动生成setter, getter方法内部实现:

//当把属性的语义特性声明为retain时,自动生成setter方法内部实现
- (void)setBrand:(NSString *)brand
{
if (_brand != brand) {//如果旧值不等于新值
[_brand release];//旧值先release
_brand = [brand retain];//新值retain赋值给旧值
}
}

//当把属性的语义特性声明为retain时,自动生成getter方法内部实现
- (NSString *)brand
{
return [[_brand retain] autorelease];
}

//当把属性的语义特性声明为copy时,自动生成setter方法内部实现
- (void)setColor:(NSString *)color
{
if (_color != color) {
[_color release];
_color = [color copy];
}
}

//当把属性的语义特性声明为copy时,自动生成getter方法内部实现
- (NSString *)color
{
return [[_color retain] autorelease];
}

//当把属性的语义特性声明为assign时,自动生成setter方法内部实现
- (void)setPrice:(CGFloat)price
{
_price = price;
}

//当把属性的语义特性声明为assign时,自动生成getter方法内部实现
- (CGFloat)price
{
return _price;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: