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 ...
随机推荐
- HttpHandler动态生成图片
1.向服务器请求返回图片,浏览器是不知道服务上有这个图片的存在的,只是发出请求,接收请求,显示图片 string path = context.Server.MapPath("~/1.jpg ...
- 字符串匹配与KMP算法实现
>>字符串匹配问题 字符串匹配问题即在匹配串中寻找模式串是否出现, 首先想到的是使用暴力破解,也就是Brute Force(BF或蛮力搜索) 算法,将匹配串和模式串左对齐,然后从左向右一个 ...
- MySQL数据库的主从同步实现及应用
>>主从同步机制及应用 读写分离(Read/Write Splitting)让主数据库处理事务性增.改.删操作(INSERT.UPDATE.DELETE),从数据库处理SELECT查询操作 ...
- 添加Java文档注释
一.在Eclipse中add javadoc comment的快捷键为: 快捷键为:ALT + SHIFT +J 二.Window-->Preferences-->General--> ...
- html5 (个人笔记)
妙味 html5 1.0 <!DOCTYPE html> <html> <head lang="en"> <meta charset=& ...
- HDU 4612 Warm up tarjan缩环+求最长链
Warm up Problem Description N planets are connected by M bidirectional channels that allow instant ...
- Codeforces Round #Pi (Div. 2) C. Geometric Progression map
C. Geometric Progression Time Limit: 2 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/5 ...
- python 添加类属性
类属性必须赋值. 创建类属性 类是模板,而实例则是根据类创建的对象. 绑定在一个实例上的属性不会影响其他实例,但是,类本身也是一个对象,如果在类上绑定一个属性,则所有实例都可以访问类的属性,并且,所有 ...
- 简单几何(线段相交) POJ 1066 Treasure Hunt
题目传送门 题意:从四面任意点出发,有若干障碍门,问最少要轰掉几扇门才能到达终点 分析:枚举入口点,也就是线段的两个端点,然后选取与其他线段相交点数最少的 + 1就是答案.特判一下n == 0的时候 ...
- 贪心 Gym 100502E Opening Ceremony
题目传送门 /* 题意:有一堆砖块,每一次操作可以选择消去任意一行,也可以选择消去任意一列.求要消去所有的砖块需要最小的操作数 贪心:首先清楚的是消去最高列的最佳,消去第一行最佳,行列的顺序只对中间过 ...