ObjectC----Property,Attribute,点语法,KVC,KVO
来源:互联网 发布:自动画趋势线指标源码 编辑:程序博客网 时间:2024/05/06 03:44
// Created By 郭仔 2015年4月8日22:35:18
这两天家里有些事情,回家了两天,把博客给耽搁了,今天晚上补上......
Property属性:简化代码,为实例变量提供了setter、getter方法的默认实现
成员变量也不用再单独声明了。
//@property本质是方法,提供getter setter 方法的默认实现
//在声明属性时,如果属性对应的实例变量已经在.h文件中声明,则直接生成对应实例变量的getter,setter方法,如果没有声明实例变量,会在该类中添加私有成员变量。
例如:
@property NSString *name;
Attribute:属性的属性,为属性提供了⼀些关键字⽤以控制setter、getter的实现细节,这些关键字我们
称为属性的属性(attribute)。
一共3大类attribute:
第1类:读写性控制(readonly、readwrite、setter、getter)
readonly,告诉编译器,只声明getter⽅法(⽆setter⽅法)。
例如:@property(readonly)NSString *name;
//等价于 - (NSString *)name;
readwrite,告诉编译器,既声明setter⼜声明getter。
例如: @property(readwrite)NSString *name;
//等价于 - (NSString *)name;
- (void)setName:(NSString *)name;
readwrite是读写性控制的默认设置。
第2类:原子性控制(nonatomic、atomic)
atomic。setter、getter⽅法在多线程访问下是绝对安全的,即
setter、getter内部做了多线程访问处理。原⼦性控制的默认设置是
atomic
nonatomic。setter、getter⽅法内部不会做多线程访问处理,仅仅是
普通的setter、getter⽅法
程序开发过程中,setter、getter处处都在⽤,如果使⽤atomic,需要不断
的对setter、getter加锁解锁以保证线程访问安全,会很占⽤系统资源,降低
系统性能。
通常设置为nonatomic,某些属性需要线程安全的时候,才定义为atomic。
第三类:语义设置(assign、retain、copy)
assign。setter、getter内部实现是直接赋值。
retain。setter、getter的内部实现会做内存优化。
例如:@property(nonatomic,retain)NSString *name;
- (void)setName:(NSString *)name{
if(_name != name){
[_name release];
_name = [name retain];
}
}
- (NSString *)name{
return [[_name retain]autorelease];
}属性的属性
copy。setter、getter的内部实现也会做内存优化。
例如:@property(nonatomic,copy)NSString *name;
- (void)setName:(NSString *)name{
if(_name != name){
[_name release];
_name = [name copy];
}
}
- (NSString *)name{
return [[_name retain]autorelease];}
如果属性是⾮对象类型(⽐如int,float等)属性的语义设置使⽤
assign。
如果属性是对象类型(⽐如NSStrng、NSArray等)属性的语义设
置使⽤retain。
如果属性是对象类型并且想得到参数的copy,使⽤copy关键字。
点语法:属性是⼀对getter、setter⽅法,点语法是属性的另⼀种调⽤格式。比较简单不做过多说明。
===============================================================
KVC(Key-Value-Coding)键值编码,是一种间接访问实例变量的方法。
修改值的方法:
setValue:forKey:
setValue:forKeyPath:
setValue:forUndefinedKey:
setValuesForKeysWithDictionary:
获取值:
valueForKey:
valueForKeyPath:
valueForUndefinedKey:
当key不存在的时候,会执行setValue:forUndefinedKey: 往往在.m文件中重写该方法,避免程序结束。
==========================================================================
上面部分的代码综合:
Teacher *teacher=[[Teacher alloc]init]; teacher.name=@"lisi"; teacher.classs=12; teacher.level=@"A"; teacher.count=48; NSLog(@"name=%@ classs=%d level=%@ count=%d",teacher.name,teacher.classs,teacher.level,teacher.count); [teacher setValue:@"zhangsi" forKey:@"name"]; NSLog(@"%@",teacher.name); [teacher setValue:@"B" forKey:@"level"]; [teacher setValue:@14 forKey:@"classs"]; [teacher setValue:@49 forKey:@"count"]; NSLog(@"name=%@ classs=%d level=%@ count=%d",teacher.name,teacher.classs,teacher.level,teacher.count);=================================================================
KVO:键值监听
addObserver:forKeyPath:options:context:
removeObserver:forKeyPath:
removeObserver:forKeyPath:context:
observeValueForKeyPath:ofObject:change:context:
- ObjectC----Property,Attribute,点语法,KVC,KVO
- 点语法和KVC
- OC学习第八天_属性 属性的Attribute 点语法 KVC
- Objective-C语法入门之KVC & KVO
- OC语法之KVC与KVO
- 08 属性 点语法 KVC
- OCday4 属性, 点语法, KVC
- OC04_属性,kvc,点语法
- day8: 属性、点语法、KVC
- 属性,Property,点语法
- @property 和 点语法
- KVC、KVO
- KVO/KVC
- kvc 、kvo
- KVO/KVC
- KVC/KVO
- KVO/KVC
- KVC、KVO
- 编译Flume-NG源码之1.5.2版本
- PHP之冒泡排序的优化
- 亮潮毖谑贤塘敢妨彼浦缚淳载菩浪
- oracle之时间查询
- 成为优秀Java程序员的10个要点
- ObjectC----Property,Attribute,点语法,KVC,KVO
- 重写Flume-NG-morphline-avro-sink
- poj3522 Slim Span
- 窝韵磐逞贤虑拼萄匮榷霸赐瓶突蒂
- Maven入门
- 项目中怎么控制多线程高并发访问
- java仿百度文库、豆丁在线阅读
- 服务端和Android客户端利用Socket传输JSON数据
- Introduction to AQuery – Android Query 翻译