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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值