您的位置:首页 > 移动开发 > IOS开发

iOS 声明属性关键字

2016-03-26 17:35 260 查看
atomic:

原子操作

指原子性是指事务的一个完整操作,操作成功就提交,反之就回滚。

在objective-c 属性设置里面 默认的是atomic ,意思是 setter /getter函数是一个原子操作,如果多线程同时调用setter时,不会出现某一个线程执行完setter所有语句之前,另一个线程就开始执行setter,相当于 函数头尾加了锁 , 并发访问性能会比较低 。

nonatomic:

非原子操作 一般不需要多线程支持的时候使用,这样在 并发访问的时候效率会比较高 。在objective-c里面通常对象类型都应该声明为非原子性的。

iOS中程序启动时系统只会自动生成一个单一的主线程,程序在执行的时候一般情况下是在同一个线程里面对一个属性进行操作。

如果在程序中 某一个属性会在多线程中被使用,并且需要做数据同步,就必须设置成原子性的,但也可以设置成非原子性的,然后自己在程序中用加锁之类的来做数据同步。

头文件中声明属性时,使用atomic 和 nonatomic等价于在头文件里面添加2个函数,一个是用于设置这个属性的,一个是用于读取这个属性

例如:- (nsstring )name; - (void)setName:(NSString )str;

atomic / nonatomic 需要和@synthesize/@dynamic配和使用才有意义。

@property, 是iOS6以后增加的关键词. 声明属性后, 编译器会自动生成setter和getter方法,名称为_xxx 的成员变量(xxx是属性定义的变量)

在声明property属性后,有2种实现选择

@synthesize

编译器期间,编译器自动生成getter/setter方法。

当有自定义的存或取方法时,自定义会屏蔽自动生成该方法

声明时:@synthesize xxx=_xxx;

访问此成员变量方式

1、self.xxx

2、_xxx

不声明访问此成员变量

1、self.xxx

2、_xxx

对比,发现二者访问成员变量方式一样。

@dynamic

告诉编译器,不自动生成getter/setter方法,其getter和setter方法会在程序运行的时候或者用其他方式动态绑定,以便让编译器通过编译。其主要的作用就是用在NSManageObject对象的属性声明上,由于此类对象的属性一般是从Core Data的属性中生成的,Core Data框架会在程序运行的时候为此类属性生成getter和Setter方法。

具体操作:

在 NSObject 中继承而来的 +(BOOL) resolveInstanceMethod:(SEL) sel 方法中指定 动态实现的方法或者函数。

属性修饰其他关键字:

getter=getterName

指定 get 方法,并需要实现这个方法 。必须返回与声明类型相同的变量,没有参数

setter=setterName

指定 set 方法,并需要实现这个方法 。带一个与声明类型相同的参数,没有返回值(返回空值)

readwrite

默认是 readwrite ,可读可写。

readonly

只能读,不可以写。

assign

所有属性都 默认 assign ,通常用于标量(简单变量 int , float , CGRect 等)。

一种典型情况是用在,对象没有所有权时,通常是 delegate ,避免造成死循环(如果用 retain 的话会死循环)。

retain

属性必须是 objc 对象,拥有对象所有权,必须在 dealloc 中 release 一次。

copy

属性必须是 objc 对象,拥有对象所有权,必须在 dealloc 中 release 一次。且属性必须实现 NSCopying 协议,一般常用于 NSString 类型。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: