属性
一.属性(描述类的特征)
1.属性是Objective-C 2.0定义的语法,为实例变量提供了setter和getter方法的默认实现,能在一定程度上简化代码,增强实例变量的访问安全性.
2,属性的定义
2.1.属性的声明: 使用@property声明属性,相当在@interface中声明了两个方法(setter和getter),如:@property (NSString *)name;
2.2.属性的实现: 使用@synthesize实现属性,相当于在@implementation中实现了setter和getter这两种方法,如:@synthesize name = _name;
二.属性的属性
1.为属性提供了一些关键字泳衣控制setter、getter的实现细节,这些关键字我们称之为属性的属性(attri),共有三大类的attribute.
三大类attribute:
第一大类:读写控制
读写控制包括:
readonly: readonly告诉编器,之只声明getter方法,无setter方法 readwrite:告诉编译器,即声明setter方法也声明getter方法
第二大类:原子性控制:
atomic:setter、getter方法在多线程访问下是绝对安全的,即setter、getter内部做了多线程访问处理.原子性控制的默认设置是atomic;
nonatomic:setter、getter内部不会做多线程访问处理
程序开发过程中,setter、getter处处都在⽤用,如果使⽤用atomic,需要不断 的对setter、getter加锁解锁以保证线程访问安全,会很占⽤用系统资源,降低系统性能.
第三大类:语义设置(assign,retain,copy)
assign:setter、getter内部实现是直接赋值.
retain:setter、getter的内部会做内存优化.
copy:setter、getter的内部也会做内存优化
如果属性是非对象类型(比如int,float等)属性的语义设置使用assign,
如果属性是对象类型(比如NSString,NSArray等),属性设置为retain,
如果属性是对象类型并且想得到参数的copy,使用copy关键字
三.点语法
点语法提供了一种快捷的访问方式,凡符合系统默认setter、getter书写格式的方法都可以使用点语法,属性是一对getter、setter方法,点语法是属性的另一种调用格式.
四.KVC(key-value-coding,即键值编码)
KVC是一种间接访问实例变量的方法.
key:键没用于标识实例变量
value:实力变量对应的值
修改值:
第一种形式:
setValue:forKey:
setValue:forUndefinedKey://防止报错
setValue:forKryPath:
setValuesForKeysWithDictionary:
获取值:
valueForkey
valueForUndefinedKey://防止报错
valueForKeyPath:
注意:当key值不存在的时候,会执行setValue:forUndefinedkey:
系统默认实现是抛出一个异常.
KVC距离说明:
//KVC:
//KVC是用来给(没有getter和setter方法的)实例变量赋值和取值
//key一定要跟我们的实例变量一样(下划线可以不要)
一.属性(描述类的特征)
1.属性是Objective-C 2.0定义的语法,为实例变量提供了setter和getter方法的默认实现,能在一定程度上简化代码,增强实例变量的访问安全性.
2,属性的定义
2.1.属性的声明: 使用@property声明属性,相当在@interface中声明了两个方法(setter和getter),如:@property (NSString *)name;
2.2.属性的实现: 使用@synthesize实现属性,相当于在@implementation中实现了setter和getter这两种方法,如:@synthesize name = _name;
二.属性的属性
1.为属性提供了一些关键字泳衣控制setter、getter的实现细节,这些关键字我们称之为属性的属性(attri),共有三大类的attribute.
三大类attribute:
第一大类:读写控制
读写控制包括:
readonly: readonly告诉编器,之只声明getter方法,无setter方法 readwrite:告诉编译器,即声明setter方法也声明getter方法
第二大类:原子性控制:
atomic:setter、getter方法在多线程访问下是绝对安全的,即setter、getter内部做了多线程访问处理.原子性控制的默认设置是atomic;
nonatomic:setter、getter内部不会做多线程访问处理
程序开发过程中,setter、getter处处都在⽤用,如果使⽤用atomic,需要不断 的对setter、getter加锁解锁以保证线程访问安全,会很占⽤用系统资源,降低系统性能.
第三大类:语义设置(assign,retain,copy)
assign:setter、getter内部实现是直接赋值.
retain:setter、getter的内部会做内存优化.
copy:setter、getter的内部也会做内存优化
如果属性是非对象类型(比如int,float等)属性的语义设置使用assign,
如果属性是对象类型(比如NSString,NSArray等),属性设置为retain,
如果属性是对象类型并且想得到参数的copy,使用copy关键字
三.点语法
点语法提供了一种快捷的访问方式,凡符合系统默认setter、getter书写格式的方法都可以使用点语法,属性是一对getter、setter方法,点语法是属性的另一种调用格式.
四.KVC(key-value-coding,即键值编码)
KVC是一种间接访问实例变量的方法.
key:键没用于标识实例变量
value:实力变量对应的值
修改值:
第一种形式:
setValue:forKey:
setValue:forUndefinedKey://防止报错
setValue:forKryPath:
setValuesForKeysWithDictionary:
获取值:
valueForkey
valueForUndefinedKey://防止报错
valueForKeyPath:
注意:当key值不存在的时候,会执行setValue:forUndefinedkey:
系统默认实现是抛出一个异常.
KVC距离说明:
//KVC:
//KVC是用来给(没有getter和setter方法的)实例变量赋值和取值
//key一定要跟我们的实例变量一样(下划线可以不要)
//KVC在执行的时候,先去找KEY里面的这个值是否是类的实例变量,如果有就赋值,如果没有,找有没有_key(下划线就是key里面的值)
/*
//第一种形式
[p setValue:@"zhangsan" forKey:@"name"];
NSLog(@"%@",[p valueForKey:@"name"]);
[p setValue:@"hjadksof" forKey:@"age"];
NSLog(@"%@",[p valueForKey:@"age"]);
Student *stu = [[Student alloc]init];
//KVC
[stu setValue:@"ajdfkh" forKey:@"name"];
NSLog(@"%@",[stu valueForKey:@"name"]);
[stu setValue:@"m" forKey:@"sex"];
NSLog(@"%@",[stu valueForKey:@"sex"]);
*/
/*
//KVC第二种形式
Husband *hus = [[Husband alloc]init];
Wife *wife1 = [[Wife alloc]init];
//这一句就是给Husband的wife赋值
[hus setValue:wife1 forKey:@"wife"];
//此处(path中)的点是路径的意思(实例变量的实例变量)
[hus setValue:@"ruhua" forKeyPath:@"wife.name"];
NSLog(@"%@",[hus valueForKeyPath:@"wife.name"]);
//练习
Woman *femal = [[Woman alloc]init];
Children *kid = [[Children alloc]init];
[femal setValue:kid forKey:@"child"];
[femal setValue:@"houzi" forKeyPath:@"child.name"];
NSLog(@"%@",[femal valueForKeyPath:@"child.name"]);
*/
//KVC第三种形式
NSDictionary *dic = @{@"name":@"Coco",@"age":@"22",@"sex":@"f"};
Model *model = [[Model alloc] init];
[model setValuesForKeysWithDictionary:dic];
NSLog(@"%@",[model valueForKey:@"sex"]);
//以后每个类的.m中都重写description方法
//按照想要的形式打印出对象的信息
-(NSString *)description{
return [NSString stringWithFormat:@“name:%@ age:%@ sex:%@",_name,_age,_sex];
}