iOS中@property的属性相关

attribute有如下几种取值,各个attribute的含义涉及到Objective-C中内存管理的相关知识;

attribute主要分为三类:
  • 读写属性:(readwrite/readonly)决定是否生成set访问器,设置可供访问级别
  • setter语意:(assign/retain/copy)set访问器的语义决定以何种方式对数据成员赋予新值
  • 原子性:(atomic,nonatomic)

readwrite:生成setter/getter方法(这是系统默认的)

readonly: 只生成getter方法.

此标记说明属性是只读的,如果你指定了readonly,在@implementation中只需要一个getter。或者如果你使用@synthesize关键字,也只会生成getter方法。如果你试图使用点操作符为属性赋值,你将得到一个编译错误。readonly关键字代表setter不会被生成, 所以它不可以和 copy/retain/assign组合使用。

assign: 简单赋值,不更改索引计数


此标记说明设置器直接进行赋值,这也是默认值。在使用垃圾收集的应用程序中,如果你要一个属性使用assign,且这个类符合NSCopying协议,你就要明确指出这个标记,而不是简单地使用默认值,否则的话,你将得到一个编译警告。这再次向编译器说明你确实需要赋值,即使它是可拷贝的。

setter方法直接赋值,不进行任何retain操作,为了解决原类型与环循引用问题


retain: 释放旧的对象,将旧对象的值赋予输入对象,再增加输入对象的索引计数为1

指定retain会在赋值时唤醒传入值的retain消息。此属性只能用于Objective-C对象类型,而不能用于Core Foundation对象。(原因很明显,retain会增加对象的引用计数,而基本数据类型或者Core Foundation对象都没有引用计数)。

setter方法对参数进行release旧值再retain新值,所有实现都是这个顺序

copy: 建立一个索引计数为1的对象,然后释放旧对象

它指出,在赋值时使用传入值的一份拷贝。拷贝工作由copy方法执行,此属性只对那些实行了NSCopying协议的对象类型有效。更深入的讨论,请参考”复制”部分。

atomic/nonatomic:

指出访问器不是原子操作,atomic表示属性是原子的,支持多线程并发访问,而默认地nonatomic,访问器是原子操作。这也就是说,在多线程环境下,解析的访问器提供一个对属性的安全访问,从获取器得到的返回值或者通过设置器设置的值可以一次完成,即便是别的线程也正在对其进行访问。如果你不指定nonatomic,在自己管理内存的环境中,解析的访问器保留并自动释放返回的值,如果指定了nonatomic,那么访问器只是简单地返回这个值。没有特别的多线程要求建议用 nonatomic 有助于提高性能。

在iOS5引入了自动引用计算(ARC)之后,对象变量属性新增了strong和weak,strong与retain作用类似,可以说是用来代替retain.

访问修饰符

Objective-C提供了3条指令来控制对一个对象的实例变量的访问:

@protected: 用此指令修饰的实例变量可以被该类和任何子类定的方法直接访问,这是默认情况。
@private: 用此指令修饰的实例变量可以被定义在该类的方法直接访问,但是不能被子类中定义的方法直接访问。
@public: 用此指令修饰的实例变量可以被该类中的方法直接访问,也可以被其它类定义的方法直接访问。
@package 关键字是在Mac 10.5 Objective-C runtime中新添加的,用以支持64-bit系统。


@property (nonatomic,retain)中的nonatom和retain是什么意思


@property是一个属性访问声明,扩号内支持以下几个属性:
  1. getter=getterName,setter=setterName,设置setter与getter的方法名
  2. readwrite,readonly,设置可供访问级别
  3. assign,setter方法直接赋值,不进行任何retain操作,为了解决原类型与环循引用问题
  4. retain,setter方法对参数进行release旧值再retain新值,所有实现都是这个顺序
  5. copy,setter方法进行Copy操作,与retain处理流程一样,先旧值release,再Copy出新的对象,retainCount为1。这是为了减少对上下文的依赖而引入的机制。
  6. nonatomic,非原子性访问,不加同步,多线程并发访问会提高性能。注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问。锁被加到所属对象实例级。



@synthesize xxx;  为这个新属性自动生成读写函数;



如果你不懂怎么使用他们,那么就这样 ->

  • 使用assign: 对基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double, char, 等等)
  • 使用copy: 对NSString
  • 使用retain: 对其他NSObject和其子类



ARC状态下自动引用计数的情况下我们使用strong去修饰对象类型苹果对此特性进行了优化


关于strong和weak怎么用:
如果一个对象在某段时间中反复加载,而你又不希望每次加载都要重新alloc 的话,那就strong,strong 保证对此对象保持一个强引用,对于这个对象,只要有1个strong引用的话,那它就不会释放,当然多个strong同时作用于它也不会释放。

如果一个对象在某段时间只会加载一次,并且加载之后确定不再使用了,那就可以使用weak,这样当其他原因导致引用计数减1(比如 removefromsuperview)的时候,此对象就自动释放了。无需再在delloc 里面再release一次,但你要保证释放之后确实不再使用此对象,否则将导致错误

其实strong和retina的作用有些像,只不过strong 和weak是在arc里面引入的,他俩算是一对儿, 对应关系有点类似 retiam 和assign 

NSString类用copy,控件类用weak,复杂数据类的用strong,基本数据类型,比如NSInteger,CGRect这些用assign;



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值