property与所有权修饰符

1、各个属性选项的意义

Objective-c中,@property选项有assign、retain、unsafe_unretain、strong、weak和copy六个选项,其中strong、weak、unsafe_unretain是在引入ARC后新添加的选项。

strong与unsafe_unretain主要用在ARC下,作用分别与retain和assign相同,weak则是ARC专用。

2、ARC下属性与修饰符的关系

声明的属性 所有权修饰符
assign __unsafe_unretained
weak __weak
copy __strong (但是赋值的是被复制的对象)
retain __strong
strong __strong
unsafe_unretained __unsafe_unretained

以上各种属性赋值给指定的属性中就相当于赋值给附加各属性对应的所有权修饰符的变量中。只有copy属性不是简单的赋值,它赋值是通过NSCopying接口的copyWithZone:方法复制赋值源所生成的对象。

3、MRC下的属性与setter/getter方法

所有权修饰符是ARC中新增的内容,在MRC下需要通过retain/release等方法手动管理内存
MRC下,可以使用的与内存管理相关属性关键字有assign、retain、copy,对应的setter/getter方法如下

//assign的setter
- (void)setObj:(NSInteger)obj
{
    _obj = obj;
}

//retain的setter方法
- (void)setObj:(id)obj
{
    if(_obj != obj) {
        [_obj release];
        _obj = [obj retain];
    }
}

//copy的setter方法
- (void)setObj:(id)obj
{
    if(_obj != obj) {
        [_obj release];
        _obj = [obj copy];
    }
}

//assign的getter方法
- (NSInteger)obj
{
    return _obj;
}

//retain与copy的getter方法
- (id)obj
{
    return [[_obj retain] autorelease];
}

4、ARC下属性与setter/getter方法
根据ARC属性与所有权修饰符的关系,属性对应变量已加上对应的修饰符,故setter/getter方法如下

//property(copy) NSObject *obj;
-(void)setObj:(id)obj
{
    //变量_obj的修饰符为__strong,但是copy需要通过NSCopying接口的copyWithZone:方法复制赋值源所生成的对象
    _obj = [obj copy];
}

//property(strong/weak/assign等剩余属性) NSObject *obj;
- (void)setObj:(id)obj
{
    //变量_obj修饰符为__strong, __weak, __unsafe_unretained等
    _obj = obj;
}

@property (nonatomic, copy) NSString *name; 重写 setter 方法

你可能感兴趣的:(property与所有权修饰符)