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机制,对象的申 ...
随机推荐
- python基础教程_学习笔记9:抽象
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/signjing/article/details/30745465 抽象 懒惰即美德. 抽象和结构 抽 ...
- 搭建Cordova + Ionic + WebStorm环境开发Web App应用
1. 下载并且安装Node.js(https://nodejs.org/en/) 2. 打开终端,安装cordova (如果安装失败或者卡住不动则重新安装) sudo npm install - ...
- 代码编辑器之sublime text
http://www.iplaysoft.com/sublimetext.html 1.特点: 中文乱码问题:另外,很多朋友反映表示打开中文会有乱码,其实是因为ST2本身只支持UTF-8编码,而我们常 ...
- Delphi 的 Bit
我一直感觉 Delphi 下的Bit操作不是很好使, 所以一直屏蔽着这方面的学习.不过最近收集整理了一下代码. 原因是这样的. 由于某个需求被分解成 在 0~n(不定) 中,有几个数字被置换成了“tr ...
- linux 服务器之间配置免密登录
客户机:172.16.1.2 远程机:172.16.1.3 1.远程机 a.允许root用户通过22端口登录 vi /etc/ssh/sshd_config PORT 22 PermitRootLog ...
- linux的系统组成和计算机组成原理,linux常用操作
Linux入门 linux简介 学习目的:linux服务器操作系统稳定长期运行,python,pycharm装于linux上 linux系统组成 应用软件:调用系统软件接口 linux操作系统分两 ...
- Azure SQL 数据库仓库Data Warehouse (2) 架构
<Windows Azure Platform 系列文章目录> 在上一篇文章中,笔者介绍了MPP架构的基本内容 在本章中,笔者给大家介绍一下Azure SQL Data Warehouse ...
- PHP_EOL DIRECTORY_SEPARATOR
换行符 PHP_EOL unix系列用 \n windows系列用 \r\n mac用 \r PHP中可以用PHP_EOL来替代,以提高代码的源代码级可移植性 路径上的斜杠 DIRECTORY_ ...
- Tribon/AM 数据库名字的含义
收集在这里备用 数据库名 Tribon环境变量 内容描述 船体型线数据库 SB_CGDB 船体外型信息 型表面,船体曲线,板缝 船体结构数据库 SB_OGDB 船体模型信息 板材数据库 SB_PLDB ...
- C++进阶--RAII 资源获取即初始化
//############################################################################ /* 资源获取即是初始化 (RAII) * ...