iOS @property语句
@property声明的形式是:
@property ( attributes ) type name;
type和name的含义一目了然,attributes描述了如何编写访问器。
一、assign retain copy
这些属性影响到合成的setter如何构建。
如果使用assign,setter直接将新值赋值给特性。
myProperty = newValue;
assign属性是一个非对象特性的唯一选择。
对于在引用计数下的对象特性,assign创建了一个弱引用。
要使用copy,特性的类型必须是能够复制的类。类必须通过实现copyWithZone:而采用NSCopying协议。
如果没有显示指定assign,retain,copy,编译器假设一个 默认值assign,这对于基础类型没有问题。然而,对于引用计数下的对象特性,如果你没有指定三者之一,则会得到一个编译器警告。
如何在复制和保留之间做出选择?这取决于你的对象的设计,以及特性是什么。
如果特性要作用一个可变对象的当前状态的快照,则应该复制它。
如果用来设置一个特性的对象是要对一个实体自身建模,而不是对实体的当前状态建模,则应该保留它。
二、readwrite readonly
如果一个特性是声明为readwrite的,则该特性的值可以设置也可以获取,两个访问器都合成,这是默认的。
如果特性是readonly的,只有getter合成。如果试图使用setter,则会得到一个“does not respond to selector”异常而崩溃。
三、nonatomic
这个属性有点奇怪,因为他没有对应的atomic关键字。没有声明为nonatomic的特性,默认都是atomic的。如果指定了nonatomic,则编译器合成访问器而不考虑线程安全性。
当在多线程程序中访问一个特性时,有可能在完成设置和获取之前,一个线程被另一个线程中断了。如果第二个线程在中断过程中修改了特性,那么在第一个线程中返回的或设置的值可能会不一致或错误。为了防止这种情况,可以声明特性为atmoic的(通过省略关键字nonatomic),然后,合成的访问器将是atomic的,这样设置或获取都会正确的完成,而不会受到另一个线程的打扰。
对于一个非对象特性或者当使用垃圾收集时,getter是一条简单的返回语句,而setter是一条简单的赋值,并且总是atomic的。对于引用计数下的 对象特性,还会有更多的困难。合成的setter和getter使用锁来防止其他线程中断或获取。此外,getter保留然后自动释放返回的对象。
在getter部分的行为,防止了另一个线程释放该对象,从而潜在的导致在线程有机会使用或保留它之前,其引用计数减少到0.
锁在性能方面付出了代价,如果你不打算编写多线程代码,则应该将自己的特性声明为nonatomic的。然后,合成的访问器不会使用锁。getter直接返回对象。
四、setter=name 和 getter=name
通常,特性myProperty的合成名称,对于setter和getter来说,分别是setProperty和getProperty。setter = name 和 getter = name 允许你提供其他的名称。其主要用途是允许针对一个布尔特性的getter,这提高了代码的可读性。
五、attributes 和 @dynamic
如果提供了自己的访问器方法的实现,那么编译器不会检查你提供的方法是否与对应的@property声明中的attributes一致。它默默的允许你做一些不正确的事。
eg:对声明为copy的特性赋值,或者为声明为readonly的特性提供一个setter方法。
六、


iOS @property语句的更多相关文章
- 解决错误: ios property has a previous declaration
今天维护一个项目的时候,我新添加了一个库,运行的时候报错了: ios property has a previous declaration 上网查了一下没有找到思路,不过根据提示自己试了一下,原来这 ...
- iOS - property,strong,weak,retain,assign,copy,nomatic 的区别及使用
1:ARC环境下,strong代替retain.weak代替assign,xcode 4.2(ios sdk4.3和以下版本)和之前的版本使用的是retain和assign,是不支持ARC的.xcod ...
- @property语句
@property声明的形式是: @property ( attributes ) type name; type和name的含义一目了然,attributes描述了如何编写访问器. 一.assign ...
- iOS Property 关键字的使用
atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作. atomic 设置成员变量的@property属性时,默认为atomic,提供多线程安全 ...
- iOS property中的strong 、weak、copy 、assign 、retain 、unsafe_unretained 与autoreleasing区别和作用详解
iOS5中加入了新知识,就是ARC,其实我并不是很喜欢它,因为习惯了自己管理内存.但是学习还是很有必要的. 在iOS开发过程中,属性的定义往往与retain, assign, copy有关,我想大家都 ...
- IOS 预处理语句
程序中的源代码计算机是无法识别的,需要将写好的代码转成0.1二进制代码,计算机才能识别.将源代码转成二进制代码的需要经过两步,编译和链接.编译是通过编译器将每个文件的代码都转为二进制代码,在这个过程中 ...
- iOS @property的默认属性
我是一个比较懒的人,很多情况下@property都不喜欢加属性…所以必须了解默认情况下哪些是已经有的,哪些在需要时是必须要加的. 原文链接:http://blog.sina.com.cn/s/blog ...
- ios @property
参考资料 http://blog.csdn.net/pingchangtan367/article/details/14000315 http://blog.csdn.net/xdrt81y/arti ...
- IOS @property的参数说明
1. @property的参数说明========================================ARC是苹果为了简化程序员对内存的管理,推出的一套内存管理机制使用ARC机制,对象的申 ...
随机推荐
- c# 数据类型可在在最后的带一个字母
folat的后面要带F或者f: double的后面要带D或者d: decimal的后面要带M或者m: long的后面要带L或者l:
- thinkphp5 查询的数据是对象时,获取原始数据方法
获取原始数据 如果你定义了获取器的情况下,希望获取数据表中的原始数据,可以使用: $user = User::get(1); // 通过获取器获取字段 echo $user->status; / ...
- Centos6.8 Mysql5.6 安装配置教程(转)
准备Mysql文件: 方式一:wget url(mysql下载地址); 方式二:从官网下载mysql,上传至centos(小编使用的Nodepad++的NppFTP具体做法请百度); 检查之前安装 ...
- Pullword 分词工具
def get_response(self, txt): """ 热词工具 """ datas = [] request_lists = [ ...
- 排序算法<No.1> 【计数排序】
继上篇博文,今天我将先介绍一下什么是计数排序,将计数排序描述清楚后,再进行后续的桶排序方法解决这个问题. 通常情况下,一提到排序,大家第一反应就是比较,其实,今天我要说的这个计数排序,不是基于比较的排 ...
- 【java】public,private和protected
public表示紧随其后的元素对任何人都是可用的,而private这个关键字表示除类型创建者和类型内部方法之外的任何人都不能访问的元素.protected关键字与private作用相当,差别仅在于继承 ...
- Modelsim使用流程---基于TCL命令的仿真
Modelsim使用流程---基于TCL命令的仿真 本文使用的Modelsim版本为Modelsim SE-64 10.1.c 1.File -> new -> Project 2.添加或 ...
- Hiero中的Events机制
The hiero.core.events module allows you to register method callbacks to respond to events sent by Hi ...
- 什么是词性标注(POS tagging)
词性标注也叫词类标注,POS tagging是part-of-speech tagging的缩写. 维基百科对POS Tagging的定义: In corpus linguistics, part-o ...
- HMM(隐马尔科夫模型)与分词、词性标注、命名实体识别
转载自 http://www.cnblogs.com/skyme/p/4651331.html HMM(隐马尔可夫模型)是用来描述隐含未知参数的统计模型,举一个经典的例子:一个东京的朋友每天根据天气{ ...