OC 基础之----属性

来源:互联网 发布:英雄联盟 魔兽世界知乎 编辑:程序博客网 时间:2024/05/06 16:05

1.    属性的特点是:快速生成 setter 和 getter 方法

2.    属性的声明在. h 文件中(使用 @property),属性的实现在.m文件中(@sythesize, 在 Xcode5.0之后省去)

3.    @property NSString *name;

相当于@ interface 中声明了两个方法(setter,getter),即:

-      (void)setName:(NSString *)name;

-      (NSString *)name;

4.    属性的实现:使用@ synthesize 实现属性

@sythesize name = _name;

相当于@ implementation 实现了 setter,getter

-      (void)setName:(Nsstring *)name  {    …..     }

-      (NSString *)name { ……  }

5.    实例变量的类型一致的时候,属性的声明可以合并,每个属性用逗号分开,注意,如果是对象类型一定要在每一个变量名前加一个*号

6.    读写组(readonly,readwrite)

readonly 只读属性,也就是只声明了 getter 方法(无 setter)

@property (readonly)NSString *name;

等价于 – (NSString *)name;

readwrite, 既声明了 setter又声明了getter方法

例如:@property(readwrite)NSString *name;

等价于- (void)setName:(NSString *)name;

        - (NSString *)name;

         readwrite 是读写性控制的默认设置.

7.    原子性控制(nonatomic,atomic)

1⃣  atomic setter,getter方法在多线程访问下是绝对安全的,即 setter,getter 内部做了多线程访问处理.原子性控制的默认设置是 atomic.  在同一时刻,只能使用 setter 或者 getter 方法.

2⃣  nonatomic setter,getter 方法内部不会做多线程访问处理,仅仅是普通的 setter,getter 方法.因此是不安全的,但是效率很高.

8.    重命名组(setter,getter)

setter 为set 方法重命名, setter = 方法名

getter 为 get 方法重命名,getter = 方法名.

如果是一个 BOOL类型的,会对getter 方法进行重命名(一般以 is开头, isEqual)

9.    内存管理组(assign,retain,copy)

如果属性是非对象类型(比如 int,float等)属性的语义设置使用 assign;

如果属性是对象类型(比如 NSString,NSArray 等)属性的语义设置使用 retain;

如果属性是对象类型并且想得到参数的 copy, 使用 copy 关键字.

Assign 中的 setter,getter 内部实现是直接赋值的,

Retain, copy 中的 setter,getter 内部实现是会做内存优化的.

10. 点语法

1⃣ 点语法就是 setter 和 getter 方法的快捷方式

[p setaName:@”zhangsan”]  等价于: p.name = @”zhangsan”;

[ p name] 等价于 p.name

2⃣ 当点语法后面跟等号的时候,说明是设置器(set 方法);当点语法后面有等号的时候,说明是访问器(get 方法)

3⃣ 当方法不满足需求的时候,可以对 setter 和 getter 方法进行重写;在                                             重写 setter 和 getter 的时候,需要把原子性修饰符写成nonatomic

当同时重写 setter 和 getter 方法的时候,系统就不会再帮我们生成@ synthesize name = _name;

4⃣ 只有一个实例变量拥有了 setter 和getter 方法的时候,我们才能使用点语法.

11. KVC(key – Value - Coding)键值编码

1⃣ [s setName:@”lanou” forkey:@”name”];

通过 KVC 中的实例变量在类中找实例变量,先判断有没有实例变量name,如果有就访问,如果没有,继续查找,判断有没有_ name, 如果有就访问

2⃣ 即使实例变量没有 setter 和 getter 方法也能通过 KVC 为实例变量进行赋值或取值

3⃣ 为了避免通过 KVC 编码赋值操作和取值操作,不会因为没有对应的key 值出现程序崩溃,需要在所在的类的. m 文件中,重写 setValue:forUndefinedKey 和valueForUndefinedKey:两个方法,当 key 不存的时候,会执行 setValue:forUndefinedKey:

4⃣ 也可以通过路径来修改实例变量的值[setValue: forKeyPath:]

 

 

 

 

 

 

0 0
原创粉丝点击