@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语句的更多相关文章

  1. 解决错误: ios property has a previous declaration

    今天维护一个项目的时候,我新添加了一个库,运行的时候报错了: ios property has a previous declaration 上网查了一下没有找到思路,不过根据提示自己试了一下,原来这 ...

  2. iOS - property,strong,weak,retain,assign,copy,nomatic 的区别及使用

    1:ARC环境下,strong代替retain.weak代替assign,xcode 4.2(ios sdk4.3和以下版本)和之前的版本使用的是retain和assign,是不支持ARC的.xcod ...

  3. @property语句

    @property声明的形式是: @property ( attributes ) type name; type和name的含义一目了然,attributes描述了如何编写访问器. 一.assign ...

  4. iOS Property 关键字的使用

    atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作.         atomic 设置成员变量的@property属性时,默认为atomic,提供多线程安全 ...

  5. iOS property中的strong 、weak、copy 、assign 、retain 、unsafe_unretained 与autoreleasing区别和作用详解

    iOS5中加入了新知识,就是ARC,其实我并不是很喜欢它,因为习惯了自己管理内存.但是学习还是很有必要的. 在iOS开发过程中,属性的定义往往与retain, assign, copy有关,我想大家都 ...

  6. IOS 预处理语句

    程序中的源代码计算机是无法识别的,需要将写好的代码转成0.1二进制代码,计算机才能识别.将源代码转成二进制代码的需要经过两步,编译和链接.编译是通过编译器将每个文件的代码都转为二进制代码,在这个过程中 ...

  7. iOS @property的默认属性

    我是一个比较懒的人,很多情况下@property都不喜欢加属性…所以必须了解默认情况下哪些是已经有的,哪些在需要时是必须要加的. 原文链接:http://blog.sina.com.cn/s/blog ...

  8. ios @property

    参考资料 http://blog.csdn.net/pingchangtan367/article/details/14000315 http://blog.csdn.net/xdrt81y/arti ...

  9. IOS @property的参数说明

    1. @property的参数说明========================================ARC是苹果为了简化程序员对内存的管理,推出的一套内存管理机制使用ARC机制,对象的申 ...

随机推荐

  1. debezium sql server 集成

    debezium 是一个方便的cdc connector 可以帮助我们解决好多数据实时变更处理.数据分析.微服务的数据通信 从上次跑简单demo到现在,这个工具是有好多的变更,添加了好多方便的功能,支 ...

  2. Gource 方便的软件版本可视化录制工具

    Gource 是一个特别棒的软件变更可视化录制工具,我们可以使用此工具,方便的将软件的版本变动,录制 为视频 安装 brew install gource brew install ffmpeg   ...

  3. linux下PHP手动添加扩展库

    1.进入php源程序目录中的ext目录中,这里存放着各个扩展模块的源代码,选择你需要的模块,比如curl模块: cd curl 执行phpize生成编译文件,phpize在PHP安装目录的bin目录下 ...

  4. P2P Downloader

    P2P Downloader , 当然就是 P2P 下载器了 , 就是和 比特精灵 差不多的那种 .  ^ ^ 不过这个项目没有代码 , 懒得写代码了 , 就文字描述一下吧 .   ^ ^ P2P 下 ...

  5. node start - hello world http server

    Write a file t1.js 'use strict'; const express = require('express'); // Constants const PORT = 8080; ...

  6. webpack 4 学习资料

    webpack 4 学习资料 资料 网址 webpack 中文版 https://webpack.docschina.org/configuration/ webpack 4 教程 https://s ...

  7. 关于TF-IDF的解释

    TF:term frequency ,词频 .指的是 term 出现的评率.词频和 2 个因数有关,在一个文档中出现这个词条次数越多,词频越高,文档总词条总数越多这个值被稀释. 所以  一般 TF = ...

  8. C166 8位字节位运算赋值-代码优化

    8位字节位运算赋值优化特记录下: unsigned short func1(){ unsigned short a; return a;} unsigned char func2(){ unsigne ...

  9. 运用MQTT-JMeter插件测试MQTT服务器性能

    今天我们介绍XMeter团队带来的新版MQTT-JMeter插件,您可以更为方便地添加MQTT连接.发布.订阅取样器,构造组合的应用场景,例如背景连接.多发少收.少发多收,计算消息转发时延等.利用该插 ...

  10. Hive介绍和Hive环境搭建

    一.Hive介绍 Hive包含用户接口.元数据库.解析器和数据仓库等组件组成,其中用户接口包含shell客户端.JDBC.ODBC.Web接口等.元数据库主要是指定义在hive中的表结构信息,一般保存 ...