zoukankan      html  css  js  c++  java
  • 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、在对象内部读取数据时,应该直接通过实例变量来读,而写入数据,应该通过属性来写。

     

     

  • 相关阅读:
    5.19 省选模拟赛 T1 小B的棋盘 双指针 性质
    5.15 省选模拟赛 容斥 生成函数 dp
    5.15 省选模拟赛 T1 点分治 FFT
    5.15 牛客挑战赛40 B 小V的序列 关于随机均摊分析 二进制
    luogu P4929 【模板】舞蹈链 DLX
    CF 878E Numbers on the blackboard 并查集 离线 贪心
    5.10 省选模拟赛 拍卖 博弈 dp
    5.12 省选模拟赛 T2 贪心 dp 搜索 差分
    5.10 省选模拟赛 tree 树形dp 逆元
    luogu P6088 [JSOI2015]字符串树 可持久化trie 线段树合并 树链剖分 trie树
  • 原文地址:https://www.cnblogs.com/wjw-blog/p/5690922.html
Copyright © 2011-2022 走看看