oc——类——属性——修饰词——assign retain copy strong weak unsafe_unretained

MRC

@interface FBFood : NSObject<NSCopying>
{
    NSString *_name;
    NSString *_color;
}

@end

@implementation FBFood

- (id)copyWithZone:(NSZone *)zone
{
    NSLog(@"class %s copy", object_getClassName(self));
    
    FBFood *food = [[[self class] allocWithZone:zone] init];
    food->_name = [self->_name copy];
    food->_color = [self->_color copy];
    
    return food;
}

- (void)dealloc
{
    NSLog(@"dealloc FBFood");
    [super dealloc];
}

@end

assign

@interface FBAnimal : NSObject

@property (assign) FBFood *food;

@end

@implementation FBAnimal

@end
- (void)mrc_assign
{
    FBFood *srcFood = [[FBFood alloc] init];
    
    FBAnimal *animal = [[FBAnimal alloc] init];
    animal.food = srcFood;
    
    FBFood *destFood;
    
    NSLog(@"source: food = %p, RC = %ld", srcFood, [srcFood retainCount]);
    
    destFood = animal.food;
    
    NSLog(@"property: food = %p, RC = %ld", destFood, [destFood retainCount]);
    
    [srcFood release];
    
    NSLog(@"source: food = %p", srcFood);
    
    destFood = animal.food;
    
    NSLog(@"property: food = %p", destFood);
}
output:
source: food = 0x7f9de15c3550, RC = 1
property: food = 0x7f9de15c3550, RC = 1
dealloc FBFood
source: food = 0x7f9de15c3550
property: food = 0x7f9de15c3550
assign property food在implementation中合成以下Method定义
@implementation FBAnimal
{
    FBFood *_food
}

- (FBFood *)food
{
    return _food;
}

- (void)setFood:(FBFood *)food
{
    _food = food;
}

@end
注1:assign既可修饰非oc类property,也可修饰oc类property
注2:非oc类property应使用assign
注3:oc类property不应使用assign,否则导致RC混乱

copy

@interface FBAnimal : NSObject

@property (copy) FBFood *food;

@end

@implementation FBAnimal

@end
- (void)mrc_copy
{
    FBFood *srcFood = [[FBFood alloc] init];
    
    FBAnimal *animal = [[FBAnimal alloc] init];
    animal.food = srcFood;
    
    NSLog(@"source: food = %p, RC = %ld", srcFood, [srcFood retainCount]);
    
    FBFood *destFood = animal.food;
    
    NSLog(@"property: food = %p, RC = %ld", destFood, [destFood retainCount]);
}
output:
class FBFood copy
source: food = 0x7f97b170d700, RC = 1
property: food = 0x7f97b17a7e20, RC = 2
copy property food在implementation中合成以下Method定义
@implementation FBAnimal
{
    FBFood *_food
}

- (FBFood *)food
{
    [_food retain];
    
    return _food;
}

- (void)setFood:(FBFood *)food
{
    [_food release];
    _food = [food copy];
}

@end
注:copy只能修饰oc类property,且oc类必须遵守NSCopying

retain

@interface FBAnimal : NSObject

@property (retain) FBFood *food;

@end

@implementation FBAnimal

@end
- (void)mrc_retain
{
    FBFood *srcFood = [[FBFood alloc] init];
    
    FBAnimal *animal = [[FBAnimal alloc] init];
    animal.food = srcFood;
    
    NSLog(@"source: food = %p, RC = %ld", srcFood, [srcFood retainCount]);
    
    FBFood *destFood = animal.food;
    
    NSLog(@"property: food = %p, RC = %ld", destFood, [destFood retainCount]);
}
output:
source: food = 0x7fc0a2c09540, RC = 2
property: food = 0x7fc0a2c09540, RC = 3
retain property food在implementation中合成以下Method定义
@implementation FBAnimal
{
    FBFood *_food
}

- (FBFood *)food
{
    [_food retain];
    
    return _food;
}

- (void)setFood:(FBFood *)food
{
    [_food release];
    _food = [food retain];
}

@end
注:retain只能修饰oc类property

strong

@interface FBAnimal : NSObject

@property (strong) FBFood *food;

@end

@implementation FBAnimal

@end
- (void)mrc_strong
{
    FBFood *srcFood = [[FBFood alloc] init];
    
    FBAnimal *animal = [[FBAnimal alloc] init];
    animal.food = srcFood;
    
    NSLog(@"source: food = %p, RC = %ld", srcFood, [srcFood retainCount]);
    
    FBFood *destFood = animal.food;
    
    NSLog(@"property: food = %p, RC = %ld", destFood, [destFood retainCount]);
}
output:
source: food = 0x7fee50717bf0, RC = 2
property: food = 0x7fee50717bf0, RC = 3
strong property food在implementation中合成以下Method定义
@implementation FBAnimal
{
    FBFood *_food
}

- (FBFood *)food
{
    [_food retain];
    
    return _food;
}

- (void)setFood:(FBFood *)food
{
    [_food release];
    _food = [food retain];
}

@end
注:MRC下strong同retain

weak

MRC下不支持weak修饰词

unsafe_unretained

@interface FBAnimal : NSObject

@property (unsafe_unretained) FBFood *food;

@end

@implementation FBAnimal

@end
- (void)mrc_unsafe_unretained
{
    FBFood *srcFood = [[FBFood alloc] init];
    
    FBAnimal *animal = [[FBAnimal alloc] init];
    animal.food = srcFood;
    
    FBFood *destFood;
    
    NSLog(@"source: food = %p, RC = %ld", srcFood, [srcFood retainCount]);
    
    destFood = animal.food;
    
    NSLog(@"property: food = %p, RC = %ld", destFood, [destFood retainCount]);
    
    [srcFood release];
    
    NSLog(@"source: food = %p", srcFood);
    
    destFood = animal.food;
    
    NSLog(@"property: food = %p", destFood);
}
output:
source: food = 0x7f96d361d480, RC = 1
property: food = 0x7f96d361d480, RC = 1
dealloc FBFood
source: food = 0x7f96d361d480
property: food = 0x7f96d361d480
unsafe_unretained property food在implementation中合成以下Method定义
@implementation FBAnimal
{
    FBFood *_food
}

- (FBFood *)food
{
    return _food;
}

- (void)setFood:(FBFood *)food
{
    _food = food;
}

@end
注:MRC下unsafe_unretained同assign

ARC

@interface FBFood : NSObject<NSCopying>
{
    NSString *_name;
    NSString *_color;
}

@end

@implementation FBFood

- (id)copyWithZone:(NSZone *)zone
{
    NSLog(@"class %s copy", object_getClassName(self));
    
    FBFood *food = [[[self class] allocWithZone:zone] init];
    food->_name = [self->_name copy];
    food->_color = [self->_color copy];
    
    return food;
}

- (void)dealloc
{
    NSLog(@"dealloc FBFood");
}

@end

assign

@interface FBAnimal : NSObject

@property (assign) FBFood *food;

@end

@implementation FBAnimal

@end
- (void)arc_assign
{
    FBFood *food = [[FBFood alloc] init];
    
    FBAnimal *animal = [[FBAnimal alloc] init];
    animal.food = food;
    
    NSLog(@"source: food = %p", food);
    NSLog(@"property: food = %p", animal.food);
    
    food = nil;
    
    NSLog(@"source: food = %p", food);
    NSLog(@"property: food = %p", animal.food);
}
output:
source: food = 0x7fbb41da1bf0
property: food = 0x7fbb41da1bf0
dealloc FBFood
source: food = 0x0
(lldb)
assign property food在implementation中合成以下Method定义
@implementation FBAnimal
{
    __unsafe_unretained FBFood *_food
}

- (FBFood *)food
{
    return _food;
}

- (void)setFood:(FBFood *)food
{
    _food = food;
}

@end
注1:assign既可修饰非oc类property,也可修饰oc类property
注2:非oc类property应使用assign
注3:oc类property使用assign同unsafe_unretained

copy

@interface FBAnimal : NSObject

@property (copy) FBFood *food;

@end

@implementation FBAnimal

@end
- (void)arc_copy
{
    FBFood *food = [[FBFood alloc] init];
    
    FBAnimal *animal = [[FBAnimal alloc] init];
    animal.food = food;
    
    NSLog(@"source: food = %p", food);
    NSLog(@"property: food = %p", animal.food);
    
    food = nil;
    
    NSLog(@"source: food = %p", food);
    NSLog(@"property: food = %p", animal.food);
}
output:
class FBFood copy
source: food = 0x7fe2b061dfc0
property: food = 0x7fe2b061cf70
dealloc FBFood
source: food = 0x0
property: food = 0x7fe2b061cf70
dealloc FBFood
copy property food在implementation中合成以下Method定义
@implementation FBAnimal
{
    __strong FBFood *_food
}

- (FBFood *)food
{
    return _food;
}

- (void)setFood:(FBFood *)food
{
    _food = [food copy];
}

@end
注:copy只能修饰oc类property,且oc类必须遵守NSCopying

strong

@interface FBAnimal : NSObject

@property (strong) FBFood *food;

@end

@implementation FBAnimal

@end
- (void)arc_strong
{
    FBFood *food = [[FBFood alloc] init];
    
    FBAnimal *animal = [[FBAnimal alloc] init];
    animal.food = food;
    
    NSLog(@"source: food = %p", food);
    NSLog(@"property: food = %p", animal.food);
    
    food = nil;
    
    NSLog(@"source: food = %p", food);
    NSLog(@"property: food = %p", animal.food);
}
output:
source: food = 0x7f8328f15000
property: food = 0x7f8328f15000
source: food = 0x0
property: food = 0x7f8328f15000
dealloc FBFood
strong property food在implementation中合成以下Method定义
@implementation FBAnimal
{
    __strong FBFood *_food
}

- (FBFood *)food
{
    return _food;
}

- (void)setFood:(FBFood *)food
{
    _food = food;
}

@end
注:strong只能修饰oc类property

weak

@interface FBAnimal : NSObject

@property (weak) FBFood *food;

@end

@implementation FBAnimal

@end
- (void)arc_weak
{
    FBFood *food = [[FBFood alloc] init];
    
    FBAnimal *animal = [[FBAnimal alloc] init];
    animal.food = food;
    
    NSLog(@"source: food = %p", food);
    NSLog(@"property: food = %p", animal.food);
    
    food = nil;
    
    NSLog(@"source: food = %p", food);
    NSLog(@"property: food = %p", animal.food);
}
output:
source: food = 0x7f807aea34b0
property: food = 0x7f807aea34b0
dealloc FBFood
source: food = 0x0
property: food = 0x0
weak property food在implementation中合成以下Method定义
@implementation FBAnimal
{
    __weak FBFood *_food
}

- (FBFood *)food
{
    return _food;
}

- (void)setFood:(FBFood *)food
{
    _food = food;
}

@end
注:weak只能修饰oc类property

unsafe_unretained

@interface FBAnimal : NSObject

@property (unsafe_unretained) FBFood *food;

@end

@implementation FBAnimal

@end
- (void)arc_unsafe_unretained
{
    FBFood *food = [[FBFood alloc] init];
    
    FBAnimal *animal = [[FBAnimal alloc] init];
    animal.food = food;
    
    NSLog(@"source: food = %p", food);
    NSLog(@"property: food = %p", animal.food);
    
    food = nil;
    
    NSLog(@"source: food = %p", food);
    NSLog(@"property: food = %p", animal.food);
}
output:
source: food = 0x7fd3b8c11c30
property: food = 0x7fd3b8c11c30
dealloc FBFood
source: food = 0x0
(lldb)
unsafe_unretained property food在implementation中合成以下Method定义
@implementation FBAnimal
{
    __unsafe_unretained FBFood *_food
}

- (FBFood *)food
{
    return _food;
}

- (void)setFood:(FBFood *)food
{
    _food = food;
}

@end
注1:unsafe_unretained既可修饰非oc类property,也可修饰oc类property
注2:unsafe_unretained修饰非oc类同assign
注3:如果unsafe_unretained property指向的instance object已经dealloc,则访问该unsafe_unretained property会crash

retain

@interface FBAnimal : NSObject

@property (retain) FBFood *food;

@end

@implementation FBAnimal

@end
- (void)arc_retain
{
    FBFood *food = [[FBFood alloc] init];
    
    FBAnimal *animal = [[FBAnimal alloc] init];
    animal.food = food;
    
    NSLog(@"source: food = %p", food);
    NSLog(@"property: food = %p", animal.food);
    
    food = nil;
    
    NSLog(@"source: food = %p", food);
    NSLog(@"property: food = %p", animal.food);
}
output:
source: food = 0x7f9a5ad1a060
property: food = 0x7f9a5ad1a060
source: food = 0x0
property: food = 0x7f9a5ad1a060
dealloc FBFood
retain property food在implementation中合成以下Method定义
@implementation FBAnimal
{
    __strong FBFood *_food
}

- (FBFood *)food
{
    return _food;
}

- (void)setFood:(FBFood *)food
{
    _food = food;
}

@end
注:ARC下retain同strong

总结

  • copy:MRC与ARC下无区别,只能修饰oc类property,本质调用oc类copy,因此oc类必须遵守NSCopying
  • MRC特有:retain,只能修饰oc类property
  • ARC特有:strong,weak,只能修饰oc类property
  • MRC为了兼容ARC,MRC下strong同retain,weak禁用,因为MRC下没有ARC下weak对应使用方式
  • ARC为了兼容MRC,retain同strong
  • assign:既可修饰非oc类property,也可修饰oc类property,ARC下,修饰oc类property同unsafe_unretained
  • unsafe_unretained:既可修饰非oc类property,也可修饰oc类property,MRC下同assign,修饰非oc类同assign
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值