Objective-C中属性及其特质@property、attribute
属性:
属性@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、在对象内部读取数据时,应该直接通过实例变量来读,而写入数据,应该通过属性来写。
Objective-C中属性及其特质@property、attribute的更多相关文章
- Objective - C中属性和点语法的使用
一.属性 属性是Objective—C 2.0定义的语法,为实例变量提供了setter.getter方法的默认实现能在一定程度上简化程序代码,并且增强实例变量的访问安全性 ...
- [Tips]ASP.NET MVC 发布到服务器后Model中属性相关的Attribute失效
Asp.net MVC4 开发的项目,发布到真实环境环境后Model中的一个属性设置的了Attribute,但是这些Attribute都失效. 经过对比和坚持代码发现控制长度的Attribute使用错 ...
- 如何获取类或属性的自定义特性(Attribute)
如何获取类或属性的自定义特性(Attribute) 问题说明: 在ActiveRecord或者其他的ORM等代码中, 我们经常可以看到自定义特性(Attribute)的存在(如下面的代码所示) [Pr ...
- XSS && CRLF && property&attribute
XSS cross-site scripting 跨站点脚本,为了避免与css冲突,命名为XSS.它是将恶意代码作为一个网页内容,这些恶意代码会注入到用户的浏览器中并执行,从而使用户受到攻击,常见的有 ...
- 解决SpringDataJpa实体类中属性顺序与数据库中生成字段顺序不一致的问题
一.在application.yml配置中添加数据库根据实体类自动创建数据库表的配置(这里数据库采用MySQL数据库) jpa: database: MYSQL show-sql: true #Hib ...
- VB类模块中属性的参数——VBA中Range对象的Value属性和Value2属性的一点区别
在VB中,属性是可以有参数的,而VBA中属性使用参数非常常见.比如最常用的:Worksheet.Range("A1:A10") VB的语法,使用参数的不一定是方法,也有可能是属性 ...
- Android(java)学习笔记263:Android下的属性动画(Property Animation)
1. 属性动画(Property Animation)引入: 在手机上去实现一些动画效果算是件比较炫酷的事情,因此Android系统在一开始的时候就给我们提供了两种实现动画效果的方式,逐帧动画(fra ...
- 属性声明(property declarations), 自定义属性,自动生成 get 和 set 方法,getter 和 setter
属性声明(property declarations), 自定义属性,自动生成 get 和 set 方法,getter 和 setter 一.普通的get 和set 属性. 一般的get 和set 属 ...
- Android 属性动画(Property Animation) 全然解析 (下)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38092093 上一篇Android 属性动画(Property Animatio ...
随机推荐
- iOS7隐藏顶部状态栏
找到工程中的Supporting Files/工程名-info.plist 添加设置 1.status bar is initially hidden=YES 2.View Controller-ba ...
- [Android Pro] PackageManager#getPackageSizeInfo (hide)
referce to : http://www.baidufe.com/item/8786bc2e95a042320bef.html 计算Android App所占用d的手机内存(RAM)大小.App ...
- MySQL主备停机步骤与注意事项
双十一马上到了,一堆的事情,今天登录mysql数据库服务器的时候突然发现服务器时间戳不对,比北京时间快了几分钟,我的天...随后检查了其他的几台数据库服务器发现同样都存在不同的偏差,最小的比北京时间快 ...
- 一、HTML和CSS基础--网页布局--网页布局基础
W3C标准: 由万维网联盟制定的一系列标准,包括: 结构化标准语言(HTML和XML) 表现标准语言(CSS) 行为标准语言(DOM和ECMAScript) 倡导结构.样式.行为分离. CSS 规定的 ...
- sybase常用SQL语句,工作中积累的
-------创建sybase设备 语句--------- disk init name="DEV_DB_CLIENT_DAT26", physname="F:\syba ...
- 【现代程序设计】homework-05
本次作业要求设计服务器和客户端,由于之前对网络编程是一窍不通,上上节课听宗学长讲述Tcp的时候心里想这个东西还真是高大上啊一点儿都听不懂,但是上个周末看了看C#网络编程的博客和书之后,发现这个东西入门 ...
- Windows 7下搭建Jmeter测试环境
jmeter配置.安装 一. 工具描述 apache jmeter是100%的java桌面应用程序,它被设计用来加载被测试软件功能特性.度量被测试软件的性能.设计jmeter的初衷是测试web应用,后 ...
- Linux常用命令_(文件权限)
Linux权限管理: 二.权限管理1.3种基本权限在Linux中,将使用系统资源的人员分为4类:超级用户.文件或目录的属主.属主的同组人和其他人员.超级用户拥有对Linux系统一切操作权限,对 于其他 ...
- 状态压缩 UVALive 6068 The Little Girl who Picks Mushrooms (12长春C)
题目传送门 题意:采蘑菇.现在采了n座山,共5座山,最后要求有三个篮子的蘑菇量是1024的整数倍,丢掉后一直减1024直到不超过1024 分析:n <= 3时直接1024,否则状压枚举哪三个篮子 ...
- Ubuntu 14.04 MySQL同步
主服务器:192.168.2.212 从服务器:192.168.2.211 主服务器(192.168.2.212): 先到/etc/mysql/my.cnf下 将 bind-address 127 ...