Objective-c @property小记

本文详细介绍了iOS开发中使用的不同内存管理属性,如strong、weak、copy、retain、assign等的区别及应用场景,帮助开发者理解如何避免内存泄漏。

strong与weak是由ARC新引入的对象变量属性。weak 和 strong 属性只有在你打开ARC时才会被要求使用。

@strong 和@retain相近

@weak和@assign相近,不过@weak在释放后多做了赋值为nil操作,这种好处是防止野指针捣乱,其好处,用过的人都知道。

@copy 此属性只对那些实行了NSCopying协议的对象类型有效。如同深拷贝的意思,开辟出新的内存空间,复制内容进内存  中,这样有两份对象,然后各不相干。

@retain 引用计数加1,让指针指向已有的内存地址,这样,retain出来的指针指向的地址和原地址相同,提高了引用计数,实际内存地址中只有一份数据。采用引用计数的方法

简单的一句话,@copy深拷贝 @retain浅拷贝

@assign 简单赋值,不更改索引计数
对基础数据类型 (例如NSInteger,CGFloat)和C数据类型(int, float, double, char, 等) 适用简单数据类型。特别地,在Objective-c中的delegate的属性必须设置为@assign (iOS5用@weak) ,其目的是防止循环引用导致的内存无法释放而产生的内存泄露。

比如,你用malloc分配了一块内存,并且把它的地址赋值给了指针a,后来你希望指针b也共享这块内存,于是你又把a赋值给(assign)了b。此时a和b指向同一块内存。a不再需要这块内存,能否直接释放它。如果是@retain 属性,则通过引用计数的办法管理内存,当引用计数为0 时候释放,而 用@assign则不能直接释放a,因为不知道b是否还在用内存中的东西,极度危险的操作。

@readonly  只读属性。如果你使用@synthesize关键字,也是有读取器方法(get)被解析。而且如果你试图使用点操作符为属性赋值,你将得到一个编译错误。

@readwrite此标记说明属性会被当成读写的,这也是默认属性

__weak, __strong 用来修饰变量,此外还有 __unsafe_unretained, __autoreleasing 都是用来修饰变量的。
__strong 是缺省的关键词。
__weak 声明了一个可以自动 nil 化的弱引用。
__unsafe_unretained 声明一个弱应用,但是不会自动nil化,也就是说,如果所指向的内存区域被释放了,这个指针就是一个野指针了。
__autoreleasing 用来修饰一个函数的参数,这个参数会在函数返回的时候被自动释放。

转载于:https://www.cnblogs.com/zhidao-chen/archive/2013/05/13/3075844.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值