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