@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方法。
六、


@property语句的更多相关文章
- iOS @property语句
@property声明的形式是: @property ( attributes ) type name; type和name的含义一目了然,attributes描述了如何编写访问器. 一.assign ...
- vb的property 和event
Event 语句 定义用户自定义的事件. 语法 [Public] Event procedurename [(arglist)] Event 语句包含下面部分: 部分 描述 Public 可选的.指定 ...
- asp:Property解释与例子
=======================================================================Property Get 语句在 Class 块中,声明构 ...
- 编写程序时候莫名出现<property name="dialect">org.hibernate.dialect.FirebirdDialect</property>
把<propertyname="dialect">org.hibernate.dialect.FirebirdDialect</property> 语句去掉 ...
- SilkTest天龙八部系列5-类的属性
SilkTest的面向对象机制让用户可以为类定义属性,用property语句实现.除此以外用户在类中还可以定义成员变量和不可变的setting属性.也就是是说Silktest类中可以有以下三种属性/变 ...
- .NET中公共变量与属性的区别
在我们的程序中经常会出现以下的代码: 如: 成员变量 public string Name; 或者用属性 private string name ...
- python第六天 函数 python标准库实例大全
今天学习第一模块的最后一课课程--函数: python的第一个函数: 1 def func1(): 2 print('第一个函数') 3 return 0 4 func1() 1 同时返回多种类型时, ...
- Visual Basic 函数速查
Calendar 常数 可在代码中的任何地方用下列常数代替实际值: 常数 值 描述 vbCalGreg 0 指出使用的是阳历. vbCalHijri 1 指出使用的是伊斯兰历法. Color 常数 可 ...
- whdxlib
1 数据库系统实现 实 验 指 导 书 齐心 彭彬 计算机工程与软件实验中心 2016 年 3 月2目 录实验一.JDBC 应用程序设计(2 学时) ......................... ...
随机推荐
- HDU 4513 吉哥系列故事——完美队形II (Manacher变形)
题意:假设有n个人按顺序的身高分别是h[1], h[2] ... h[n],从中挑出一些人形成一个新的队形,新的队形若满足以下要求,则就是新的完美队形: 1.连续的 2.形成回文串 3.从左到中间那 ...
- MySQL数据库监控
MySQL MTOP由PHP和Python开发,所以监控机需要安装PHP运行环境和Python环境.需要的核心包如下: 1.MySQL 5.0及以上(用来存储监控系统采集的数据) 2.Apache 2 ...
- JQuery解析json数据
<script> var data ="{" + "root:[" + "{name:'1',value:'0'}," + &q ...
- Angular JS学习之指令
1.Angular JS通过称为指令的新属性来扩展HTML:通过内置的指令来为应用添加功能: 2.AngularJS指令:AngularJS指令是扩展的HTML属性,带有前缀ng-: **ng-app ...
- Xamarin Android教程Android基本知识版本介绍与系统介绍
Xamarin Android教程Android基本知识版本介绍与系统介绍 Xamarin Android教程Android基本知识版本介绍与系统介绍,开发Andriod有时候不像iOS一样轻松,因为 ...
- log4j.xml 日志只输出指定类配置
1.日志增加appender 指定日志生成时间.格式.间隔时间. 2.category指定哪些或哪个类日志生成在文件中. 3.自定义logger避免不要将userBehavior定义到root中避免继 ...
- 差分约束系统 POJ 3169 Layout
题目传送门 题意:有两种关系,n牛按照序号排列,A1到B1的距离不超过C1, A2到B2的距离不小于C2,问1到n的距离最大是多少.如果无限的话是-2, 如果无解是-1 分析:第一种可以写这样的方程: ...
- HDU4888 Redraw Beautiful Drawings(最大流唯一性判定:残量网络删边判环)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=4888 Description Alice and Bob are playing toget ...
- Eclipse: JPA problem: Eclipse does not recognize content of persistence.xml
Link: http://stackoverflow.com/questions/3701901/eclipse-does-not-recognize-content-of-persistence-x ...
- JDBC 数据库异常 Exception 关闭的(语句,连接,ResultSet)
如果在rs.next()之前关闭了Statement或PreparedStatement,会导致下面的异常: java.sql.SQLException: 关闭的语句: next 如果在rs.next ...