【OC】@property的特性
来源:互联网 发布:市场调研数据分析方法 编辑:程序博客网 时间:2024/06/17 03:20
@property还有一些关键字,它们都是有特殊作用的
我把它们分为三类,分别是:原子性,存取器控制,内存管理
1. 原子性
atomic(默认):atomic意为操作是原子的,意味着只有一个线程访问实例变量。atomic是线程安全的,至少在当前的存取器上是安全的。它是一个默认的特性,但是很少使用,因为比较影响效率,这跟ARM平台和内部锁机制有关。
nonatomic:nonatomic跟atomic刚好相反。表示非原子的,可以被多个线程访问。它的效率比atomic快。但不能保证在多线程环境下的安全性,在单线程和明确只有一个线程访问的情况下广泛使用。
2. 存取器控制
readwrite(默认):readwrite是默认值,表示该属性同时拥有setter和getter。
readonly: readonly表示只有getter没有setter。
有时候为了语意更明确可能需要自定义访问器的名字:
@property (nonatomic, setter = mySetter:,getter = myGetter ) NSString *name;
最常见的是BOOL类型,比如标识View是否隐藏的属性hidden。可以这样声明:
@property (nonatomic,getter = isHidden ) BOOL hidden;
3. 内存管理
@property有显示的内存管理策略。这使得我们只需要看一眼@property声明就明白它会怎样对待传入的值。
assign(默认):assign用于值类型,如int、float、double和NSInteger,CGFloat等表示单纯的复制。还包括不存在所有权关系的对象,比如常见的delegate。
@property(nonatomic) int running;
@property(nonatomic,assign) int running;
以上两段代码是相同的。
在setter方法中,采用直接赋值来实现设值操作:
-(void)setRunning:(int)newRunning{
_running = newRunning;
}
retian:在setter方法中,需要对传入的对象进行引用计数加1的操作。
简单来说,就是对传入的对象拥有所有权,只要对该对象拥有所有权,该对象就不会被释放。如下代码所示:
-(void)setName:(NSString*)_name{
//首先判断是否与旧对象一致,如果不一致进行赋值。
//因为如果是一个对象的话,进行if内的代码会造成一个极端的情况:当此name的retain为1时,使此次的set操作让实例name提前释放,而达不到赋值目的。
if
( name != _name){
[name release];
name = [_name retain];
}
}
strong:strong是在IOS引入ARC的时候引入的关键字,是retain的一个可选的替代。表示实例变量对传入的对象要有所有权关系,即强引用。strong跟retain的意思相同并产生相同的代码,但是语意上更好更能体现对象的关系。
weak:在setter方法中,需要对传入的对象不进行引用计数加1的操作。
简单来说,就是对传入的对象没有所有权,当该对象引用计数为0时,即该对象被释放后,用weak声明的实例变量指向nil,即实例变量的值为0。
注:weak关键字是IOS5引入的,IOS5之前是不能使用该关键字的。delegate 和 Outlet 一般用weak来声明。
copy:与strong类似,但区别在于实例变量是对传入对象的副本拥有所有权,而非对象本身。
- 【OC】@property的特性
- OC中的属性特性(Property)
- 【@property的特性】
- OC 中"烦人"的小特性之getter和setter以及property编译指令
- OC之【@property的用法】
- OC中@property的使用
- OC @property的内存管理
- oc中@property的使用
- OC的动态特性
- OC - Property
- OC OC中的@property
- OC中@property的所有属性详解
- 十、oc中@property参数的学习
- OC中property的参数解析
- OC中@property和@synthesize的用法
- OC中对于属性的总结(@property)
- OC学习@property和@synthesize的使用
- 黑马程序员--OC之@property的使用
- oracle中查询某张表的大小
- 反射机制android
- 抽象工厂模式
- addChildViewController相关api深入剖析
- 带进度条的webview,支持网页前进和返回、刷新,返回键goBack等.
- 【OC】@property的特性
- FloatingActionButtonMenu
- 利用attrs.xml和 styles.xml定义Preference
- web.py – helloworld
- jQuery事件、计算浏览次数
- 常用命令
- Help Jimmy (POJ 1661)
- Amazon的推荐系统
- python xlsxwriter vs openpyxl