属性:

属性@property和属性attribute不同,@property在OC里有自己的一套专对实例变量的处理机制。attribute我们可以特指属性所具有或遵循的特质。

使用属性,编译器就会自动编写访问这些属性所需的方法,此过程叫做“自动合成”(autosynthesis).自动合成的过程是编译器在编译期执行。除此之外,编译器还要自定向类中添加适当类型的实例变量,并且在属性名前面加下划线,以此作为实例变量的名字。也可以用@synthesize 类指定实例变量的名字:

如:用@property声明了一个first的字符串变量:

@property (nonatomic,strong) NSString *firstName;

@sybthesize firstName = _myFirstName;//相当于更改了@property里的实例变量的名字_firstName 为 _myFirstName

@dynamic 关键字

告诉编译器:不要自动创建实现属性所用的实例变量,也不要为其创建存取方法。而且,在编译访问属性代码时,即使编译器发现没有定义存取方法,也不会报错。他相信这些方法在运行时期能找到。

比如,从CoreData框架中的NSManagedObject类里继承了一个子类,那么就需要在运行期动态创建存取方法。因为子类的某属性不是实例变量,其数据来自后端数据库中。

属性的特质:

@property (nonatomic, readwrite, copy) NSString *firstName;//三个特质

自己定义存取方法的时候,就要遵从与属性特质相符的原子性。

原子性特质:

atomic:通过锁定机制来确保其操作的原子性。如果两个线程同时读同一属性,那么无论何时, 总能看到有效的属性值。

nonatomic:不加锁,一个线程正在修改属性值时,另外一个线程也许会突然闯入,把尚未修改好 的属性值读取出来。

读写权限特质:

readwrite:属性拥有setter,getter方法,如若该属性由@synthesize实现,则编译器会自动生成这 两个方法。

readonly:属性仅拥有获取方法,自由当该属性由@synthesize实现时,编译器才会为其合成获取 方法,你可以用此特质把某个属性对外公开为只读属性,然后在.m中将其重新定义为读写属性。

内存管理语义特质:

assign:只会执行对“纯量类型”的简单赋值操作。

strong:该属性定义了一种“拥有关系”(owning relationship).为这种属性设置新值时,设置方法 先保留新值,并且释放旧值,然后再将新值设置上去。

weak:“非拥有关系”。为这种属性设置新值时,设置方法即不保留新值,也不释放旧值。属性所致的对象在销毁时,属性值也会被清空。

unsafe_unretained:与assign类似。但它只适用于“对象类型”,“非拥有关系”。当目标对象销毁时,属性值不会自动清空(所以说是不安全的,unsafe),这一点与weak 不同。

copy:设置方法不保留新值,而将其拷贝“copy”.当属性类型为NSString* 时,经常用此特质来保护其封装性。因为传递给设置方法的新值有可能指向一个样NSMutableString类的实例。这个类是NSString的子类,表示可以修改其值得字符串。此时若是不拷贝字符串,那么设置完属性之后,字符串的值就可能会在对象不知情的情况下遭人更改。所以这是就要拷贝一份“不可变”(immutable)得字符串。确保对象中的字符串值不会无意间变动。

方法名语义特质:

getter=<name>:指定“获取方法”的方法名。如果属性是Boolean型的,就可以给获取该属性的getter方法改名为isOn之类的。

setter=<name>: 一般不用。

一些复杂的属性要使用懒加载来初始化:

1、懒加载,如果使用了懒加载技术,必须通过存取方法来访问属性。懒加载的属性一般是比较复杂的属性。如自定义的属性,数组属性,字典属性等。

2、在初始化方法和dealloc方法里,总是应该直接通过实例变量来读写数据。

3、在对象内部读取数据时,应该直接通过实例变量来读,而写入数据,应该通过属性来写。

最新文章

  1. ENGLISH抠脚童鞋的福利--GitHub汉化插件
  2. Windows Server 2008 下解析二级域名的方法
  3. 2016年11月28日--ADO.Net 查、插、删、改 小练习
  4. Basic认证
  5. 八 JDBC
  6. mysql connect
  7. 逻辑(if)、关系、数字、条件运算符
  8. StringBuffer使用append提示String concatenation as argument to &#39;StringBuffer.append()&#39; call
  9. DBNull.value
  10. latex编辑器
  11. 继承LinearLayout自定义左侧菜单
  12. python爬虫从入门到放弃(九)之 Requests+正则表达式爬取猫眼电影TOP100
  13. springboot RestTemplate请求
  14. Mudo C++网络库第八章学习笔记
  15. java解析Excel(xls、xlsx两种格式)
  16. 3A - Holding Bin-Laden Captive!
  17. mybatis多对多关联查询——(十)
  18. JPush删除别名及回调函数(SWIFT)
  19. spring boot+mybatis+swagger搭建
  20. WPF中的导航框架(一)——概述

热门文章

  1. 前端代理nproxy
  2. 批量传递ID数组字符串到后台的处理
  3. thinkphp验证码使用
  4. C调Lua
  5. 拼接JSONStringer出现的不正确的情况。
  6. 【codevs2822】爱在心中 tarjan 缩点+理解
  7. OD hit跟踪 run跟踪使用问题
  8. 建模算法(十一)&mdash;&mdash;目标规划
  9. Android 利用Gson生成或解析json
  10. mysql指定某行或者某列的排序