我的iOS学习历程 - OC第八天
今天我们学的是1.属性,2.属性的属性,3.点语法,4.KVC
1.属性
声明属性的关键字
@property
如果你的实例变量_name那么你声明属性时把下划线去掉就可以
声明成属性代表系统默认帮我们实现了 setter和getter方法的声明
<span style="font-size:18px;">@property NSString *name;</span>实现的方法是:
<span style="font-size:18px;">@synthesize name = _name;</span>现在默认是不需要实现的,写完声明后就可以使用setter,getter方法
2.属性的属性
1.读写类属性
readonly 只读(系统就不会默认生成set方法了)
readwrite 读写(如果什么都不写默认就是可读写)
setter,getter 设置指定set,get方法默认生成方法名
2.原子性控制
nonatomic 没有实现多线程同时访问一个变量的操作保护
atomic (如果什么都不写默认的)添加了对多线程的保护操作(一个人上厕所故事)虽然安全,但是大量的耗费系统资源,并且这些资源是不必要浪费的,所以一般使用nonatomic
3.语义性设置
注意:创建工程默认是ARC状态(自动管理内存)
手动管理内存 MRC
assign(基本数据类型) retain(对象) copy(对象,且必须遵守NSCopying这个协议)
( 1 ). assign set,get方法的实现是直接赋值一般用来声明基本数据类型时候使用
( 2 ). retain set,get方法的实现内部实现了对内存管理的优化对象类型声明为ratain
( 3 ). copy 与retain一样但是声明成copy的话有一个条件必须遵守NSCopying这个协议,并且实现该协议的方法
实例:
<span style="font-size:18px;">@property(nonatomic,retain, setter=aa:, getter=bb) NSString *name;</span>在我们平常的编程中,基本上用的形式都是:
<span style="font-size:18px;">@property(nonatomic, retain) NSString *gender;</span>
在我们填retain的时候,方法的实现是这样的:
<span style="font-size:18px;">-(void)setName:(NSString *)name{ if (_name != name) { [_name release]; _name = [name retain]; } } </span>默认也是不用写的
3.点语法
点语法 :提供了一种快捷的访问属性的一种方法,快捷调用set get方式
<span style="font-size:18px;">NSLog(@"%@",s1.name); // 相当于调用了get方法</span>
<span style="font-size:18px;">s1.name = @"Paul"; // 相当于调用了set方法</span>
4.KVC
KVC(Key-Value-Coding),键值编码,是⼀种间接访问实例变量的⽅法。
在使用KVC的时候,要重写forUndefinedKey,setNilValueForKey方法,便于找到错误
[s1 setValue:@"allen" forKey:@"name"];// 找不到就调用forUndefinedKey
<span style="font-size:18px;">[s1 setValue:nil forKey:@"age"];// 空就调用setNilValueForKey</span>
( 1 )复合:本类中有其他类的一个对象作为实例变量
forKeyPath 这个方法相当于跨一级去间接访问属性是访问本类中属性的属性通过这个方法去访问的话需要传入一个路径,填这个路径需要一级一级的去查找(p为person类 person类有一个Phone类的实例变量)
<span style="font-size:18px;"> Phone *p1 = [[Phone alloc]init]; p.p1 = p1; p.p1.name = @"6s"; [p setValue:@"6p" forKeyPath:@"p1.name"]; NSLog(@"%@",p1.name);</span>
( 2 )通过字典去,间接赋值一个对象
<span style="font-size:18px;">NSDictionary *dic = @{@"name":@"zhuang", @"sex":@"男"}; [s1 setValuesForKeysWithDictionary:dic]; NSLog(@"姓名:%@ 性别:%@",s1.name,s1.sex);</span>( 3 )间接取值
<span style="font-size:18px;">NSLog(@"%@",[s1 valueForKey:@"name"]);</span>