美文网首页
@property---内存管理语义

@property---内存管理语义

作者: sky_fighting | 来源:发表于2018-10-09 15:44 被阅读17次

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---内存管理语义

    1、strong:持有特性,setter先保留,后赋值2、copy:拷贝特性,setter先复制,后赋值3、wea...

  • 内存管理

    内存管理语义http://www.jianshu.com/p/c579cf4b53f7 ios内存管理语义 ass...

  • 内存管理语义

    assign "设置方法"只会执行针对纯量类型,例如CGFloat、NSInteger等简单赋值操作strong...

  • 内存管理语义

    MRC 1. assign MRC 下 assign 为属性的默认修饰符,无论是简单的数据类型,还是指向对象的指针...

  • Effective Objective-C 2.0 编写高质量

    内存管理语义属性用于封装数据,而数据则要有“具体的所有权语义”(concrete ownership semant...

  • 聊聊java内存模型

    本文目录 Java内存模型 重排序 内存屏障 volatitle的内存语义 final的内存语义 一、Java内存...

  • OC-内存管理语义

    assign:'设置方法'只会针对「纯量类型」如CGFloat、NSInteger等 strong:表明「拥有关系...

  • 内存管理

    一、内存管理语义(assign、strong、weak等的区别) 1、assign “设置方法” 只会执行针对“纯...

  • Java并发编程的艺术

    第三章 volatile 3.4.4 volatile内存语义的实现 为了实现volatile内存语义,JMM会分...

  • Collection对象里的内存管理语义

    第一部分 collection包含的基础对象内存管理语义 NSMutableDictionary key、valu...

网友评论

      本文标题:@property---内存管理语义

      本文链接:https://www.haomeiwen.com/subject/ovfjaftx.html