@property---内存管理语义

1、strong:持有特性,setter先保留,后赋值
2、copy:拷贝特性,setter先复制,后赋值
3、weak:非拥有关系,修饰对象释放后,属性值会自动设置为nil
4、assign:赋值特性,用于基本数据类型
5、unsafe_unretained:非拥有关系,修饰对象释放后,属性值不会自动设置为nil

weak、assign、unsafe_unretained区别

weak:

只能修饰oc对象,当修饰的对象释放后,属性值会自动设置为nil

assign:

a、修饰基本数据类型。由于基本数据类型都是分配在栈上的,由系统分配和释放,不会造成野指针;
b、也可以用来修饰对象。当用assign修饰oc对象时,当对象释放后,指针不会指向nil,再给该对象发送消息会crash

unsafe_unretained(和assign类似):

可以修饰基本数据类型,也可以修饰oc对象,但是在释放对象后,不会将属性值自动设置为nil,实际应用中应该减少unsafe_unretained的使用,其存在的意义是出于兼容性的考虑,引用自ios编程:

ios编程:弱引用是ios5引入的新特性,针对老版本的ios开发的应用,如果要使用ARC,并且保留原有的内存管理逻辑(指针不会改变其指向的对象的拥有方个数,并且不会再对象被释放时自动置nil)就必须使用unsafe_unretained

copy

copy主要用于有可变类型的,例如:

NSString/NSMutableString、NSArray/NSMutableArray、NSDictionary/NSMutableDictionary

示例:

// 分别定义strong、copy两个属性
@property (nonatomic, strong) NSString *test1; // strong
@property (nonatomic, copy) NSString *test2; // copy

// 测试未使用copy属性test1
_test1 = @"测试strong";
NSMutableString *muTest1 = [NSMutableString stringWithString:_test1];
_test1 = muTest1;
[muTest1 setString:@"123"];
NSLog(@"test1:%@",_test1);
// 输出结果
>>>2018-10-09 16:15:26.607159+0800 test[1045:41214] test1:123

// 测试使用copy属性test2
_test2 = @"测试copy";
NSMutableString *muTest2 = [NSMutableString stringWithString:_test2];
_test2 = muTest2;
[muTest1 setString:@"456"];
NSLog(@"test2:%@",_test2);
// 输出结果
>>>2018-10-09 16:15:26.607413+0800 test[1045:41214] test2:测试copy

如上述结果所示,当没有使用copy修饰符时,如果指向可变类型,属性值就有可能在会被意外改变,为了阻止这种情况发生,就可以使用copy修饰符。

最后说一点如何让自己的类用copy修饰符:
要实现NSCopying协议,如果分可变和不可变,则要同时实现NSCopying和NSMutableCopying协议。
操作步骤:
a、声明该类遵从的NSCopying协议
b、实现Copying协议方法- (id)copyWithZone:(NSZone *)zone;

你可能感兴趣的:(@property---内存管理语义)