1. @property:

1.1. 属性的声明及实现:

之前的@property只是负责setter和getter的声明,需程序员手动实现方法 :

@property int age;   @synthesize age = _age;

现在的@property会生成实例变量及setter和getter方法的声明及实现

// 声明的时候:
@interface Person : NSObject
{int _age;int _height;double _weight;NSString *_name;}
@property int age;@property int height;
@property double weight;
@property (copy)NSString *name;@end// 实现的时候:@implementation Person// @synthesize会自动实现setter和getter方法
@synthesize age = _age; // 会自动访问_age
@synthesize name = _name;
@synthesize height = _height;
@synthesize weight = _weight;@end

会完成三件事:

1--声明setter和getter方法

2--生成成员变量(不需要在声明成员变量啦~ ~)

3--实现setter和getter方法
 
  因为@property生成的成员变量是私有的,子类不能直接访问,只能通过setter和getter方法访问
 
 自己声明的成员变量默认是protected,子类可以访问

可以将类型一致的写在同一行,用逗号隔开。(尽量不要写在一行)

若是在.h 文件中没有声明任何成员变量,@synthesize age = _age 访问_age时,若不存在,会自动生成一个成员变量_age;可见度为@private

1.2.  属性的属性/@property的参数:

1.2.1. 有三大类:原子属性,读写属性,set方法处理

1. 原子属性:

atomic:对属性加锁,多线程下线程安全,默认值,速度比nonatomic慢

nonatomic:对属性不加锁,多线程下不安全,但是速度快 (就是普通的setter getter方法)

2. 读写属性:

readwrite:生成getter、setter,默认值

readonly:只生成getter方法

3. set方法处理:

assign:直接赋值,默认值(非对象类型:基本数据类型使用)

retain:先release原来的值,再retain新值(在一个类中有关联其他对象的时候,OC对象类型:NSString,NSArray...使用)- - -内存优化

copy:先release原来的值,再copy新值(所有遵守NSCopying协议的对象使用)- - -内存优化

assign实际生成的setter方法如下:(直接赋值)

- (void)setName:(NSString *)name{_name = name;
}

retain实际生成的setter方法如下:

- (void)setName:(NSString *)name{if(_name != name){[_name release];_name = [name retain];}
}

copy实际生成的setter方法如下:

- (void)setName:(NSString *)name{if(_name != name){[_name release];_name = [name copy];}
}

其他对象类型使用retain      NSString,block使用copy吧

在@property后面加属性setter getter 相当于给系统生成的setter和getter方法重命名而已:

@property (nonatomic,assign,setter=isVip:,getter=isVip);

1.2.2. copy和retain的区别:

@property (nonatomic,retain)NSString *name:

retain是在你声明的字符串上进行修改,下面的例子:第一次将str赋给t.name后,对str进行修改,即使不用再次赋值,t.name的内容也会跟着str改变

@autoreleasepool {Teacher *t = [[Teacher alloc] init];NSMutableString *str = [NSMutableString string];[str appendString:@"猪八戒"];t.name = str;[str appendString:@"二师兄"];NSLog(@"%@",t.name);[t release];}

结果打印显示:

2015-10-07 11:29:43.588 Lesson-OC-8-Property[624:61344] 猪八戒二师兄
Program ended with exit code: 0

   @property (nonatomic,copy)NSString *name:

copy是先拷贝一份str的内容,赋值给t.name,然后对str进行修改的时候,并不会影响t.name的值

@autoreleasepool {Teacher *t = [[Teacher alloc] init];NSMutableString *str = [NSMutableString string];[str appendString:@"猪八戒"];t.name = str;[str appendString:@"二师兄"];NSLog(@"%@",t.name);[t release];}

结果打印显示:

2015-10-07 11:38:11.722 Lesson-OC-8-Property[691:64925] 猪八戒
Program ended with exit code: 0

2. KVC(key value coding):键值编码

KVC是一种间接访问实例变量的方法。

KVC操作方法由NSKeyValueCoding协议提供:

NSObject实现了这个协议,也就是OC中所有的类都支持KVC操作

2.1. 常用的KVC操作方法:

动态设置(修改值):

setValue:属性值 forKey:属性名 (用于简单的路径)

setValue:属性值 forKeyPath:属性路径 (用于复合路径)---类.类.属性

动态读取(获取值):

valueForKey:属性名

valueForKeyPath:属性名

2.2. KVC查找规则:

动态设置属性:

优先考虑调用setter,没有该方法则搜索_age成员变量,如果还是没有,则调用:setValue: forUndefinedKey:方法

动态读取属性:

优先考虑调用age的getter方法,没有该方法则搜索_age成员变量,如果还是没有,则调用:valueForUndefinedKey:方法

注:无论这些方法是私有还是其他,均可正常访问

@autoreleasepool {Person *p = [[Person alloc] init];
//        p.name = @"Henry";// 访问私有变量age:---动态设置(简单路径)[p setValue:@"Henry" forKey:@"name"]; // 给name赋值为@"Henry"[p setValue:@"male" forKey:@"sex"];[p setValue:@28 forKey:@"age"];// 在本题中age是私有变量,但是通过这个方法是可以给age赋值的!!![p showMessage];// 这个方法用来显示name sex ageNSLog(@"%@", [p valueForKey:@"name"]);Account *account1 = [[Account alloc] init];[p setValue:account1 forKey:@"account"];p.account.balance = 10.8;//@"account.balance"是因为Person类里包含了实例变量Account *account  要想给account里的balance赋值,需要根据路径找到它[p setValue:@10.09 forKey:@"account.balance"];NSLog(@"%.2f", [[p valueForKeyPath:@"account.balance"] floatValue]);// setValuesForKeysWithDictionary:就是用来将一个字典进行赋值NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"Shelock", @"name", @"male", @"sex", @"26", @"age", nil];[p setValuesForKeysWithDictionary:dic];NSLog(@"%@", p);[p release];[account1 release];}

Objective-C---8---@property KVC相关推荐

  1. Linear Programming线性规划(Introduction to Algorithms, 算法导论,CLRS)学习笔记

    Linear Programming 1. Fundamentals objective function and constraints: min/max3x1+24x2+13x3+9x4...s. ...

  2. 【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态

    一. Objective-C 方法详解 1. 方法属性 (1) OC 方法传参机制 Object-C 方法传参机制 : OC 中得参数传递都是值传递, 传入参数的是参数的副本; -- 基本类型 (值传 ...

  3. Property属性,amp;nbsp;KVC键值编码OC…

    1.属性:帮你自动生成setter 和 getter 方法      属性的声明:(写在.h中)      格式: @property 数据类型 属性名      属性的实现:(写在.m中)      ...

  4. Objective C 类变量的声明

    Objective C中类变量的声明一般有两种方式: 1)instance variable 2)property方式声明 instance variable方式声明如下: @interface My ...

  5. KVC(forKey,forKeyPath)

    KVC是Cocoa一个大招,非常牛逼. 利用KVC可以随意修改一个对象的属性或者成员变量(并且私有的也可以修改)  如:Person.m文件中: @implementation Person {   ...

  6. Objective-C中的KVC与KVO(上)

    本文转载 李朴之先生博客 http://blog.csdn.net/pucker/article/details/7413280 Objective-C中的KVC与KVO是两种比较重要的技术,这里简要 ...

  7. iOS 中KVC、KVO、NSNotification、delegate 总结及区别

    iOS 中KVC.KVO.NSNotification.delegate 总结及区别 1.KVC,即是指 NSKeyValueCoding,一个非正式的Protocol,提供一种机制来间接访问对象的属 ...

  8. iOS完全自学手册——[三]Objective-C语言速成,利用Objective-C创建自己的对象...

    1.前言 上一篇已经介绍了App Delegate.View Controller的基本概念,除此之外,分别利用storyboard和纯代码创建了第一个Xcode的工程,并对不同方式搭建项目进行了比较 ...

  9. Objective-C KVC

    为什么80%的码农都做不了架构师?>>>    KVC概述KVC是KeyValue Coding的简称,它是一种可以直接通过字符串的名字(key)来访问类属性的机制.而不是通过调用S ...

  10. (转载)OC学习篇之---KVC和KVO操作

    前一篇文章我们介绍了OC中最常用的文件操作,那么今天来看一下OC中的一个比较有特色的知识点:KVC和KVO 一.KVC操作 OC中的KVC操作就和Java中使用反射机制去访问类的private权限的变 ...

最新文章

  1. sci-learn fit_transform() 与 transform()
  2. Docker系列 四.Docker部署SpringBoot
  3. 汇编: 用int中断改变ip,实现loop循环
  4. vue 点击事件传递多个参数_vue传事件参数
  5. 为什么要使用 using namespace std
  6. tf报错之raise TypeError(“pred must not be a Python bool“)
  7. element-ui中用el-dialog+el-table+el-pagination实现文件默认选中且在分页的条件下有记忆功能...
  8. 21行代码AC——习题3-7 DNA序列(UVa-1368)_解题报告
  9. Mysql复制-Slave库设置复制延迟
  10. 已知三角形三点坐标求角度_细心研磨椭圆焦点三角形,这肯定是最全的解释。...
  11. Socket简单介绍(通过NSStream)
  12. ldconfig 和 ldd 命令用法
  13. python 随机种子 时间_python课堂整理24----时间和随机数模块
  14. import keras的错误module ‘tensorflow.compat.v2‘ has no attribute ‘__internal__‘
  15. Scala下载与安装
  16. 视频编辑专家下载v9.3官方免费版
  17. 中兴承建WoStore:联通摒弃苹果“自封神话”?
  18. 大学物理实验长度的测量实验报告_长度测量实验报告.doc
  19. 电机或编码器相关的 CW 与 CCW
  20. python 艺术照片滤镜_[宜配屋]听图阁 - Python实现PS滤镜Fish lens图像扭曲效果示例...

热门文章

  1. Android Audio - 支持多应用同时录音_Android8.1修改方法
  2. Bilateral Self-unbiased Learning from Biased Implicit Feedback-2022年9月之前最新的推荐系统方向论文
  3. SpringCloud版本Hoxton SR5 --- 第一讲:认识
  4. LPA* 路径搜索算法介绍及完整代码
  5. 澳门大学计算机语言博士生导师王珊,四年资助百余万!澳门大学人文学院招收博士生(第二批)...
  6. 【1030】计算球的体积
  7. 学习日记20160915
  8. fiori 换行_《[家教初代]Cielo》七子姬 ^第31章^ 最新更新:2010-10-22 23:30:40 晋江文学城_手机版...
  9. J2ME(cldc/midp)简介
  10. csp试题2:公共钥匙盒