标签:
?、属性
概念
属性是Objective-C 2.0定义的语法,为实例变量提供了setter、 getter?法的默认实现。能在?定程度上简化程序代码,并且增强实例变量的访问安全性
定义
@interface Person : NSObject
@property 属性的类型 属性的名字
等价
{
NSInteger _number; //实例变量
}
- (void)setNumber:(NSInteger)number;
- (NSInteger)number;
?、属性的Attribute
第?类:读写性控制属性(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;
- (NSString *)name;
setter
告诉编译器,将setter方法名改为指定名称
例如:
@property (setter=nn:)NSInteger number;
相当于将number的setNumber:方法名改为nn:
getter
给编译器指定getter方法名。getter仅在BOOL类型的属性中使用。
例如:
@property (getter=isDeath)BOOL death;
相当于将death的getter方法death改为isDeath
第?类:原?性控制属性(nonatomic、atomic)
atomic(默认)
setter、getter?法在多线程访问下是绝对安全的,即setter、getter内部做了多线程访问处理。原?性控制的默认设置是atomic
nonatomic(最常用)
setter、getter?法内部不会做多线程访问处理,仅仅是
普通的setter、getter?法
第三类:语义设置(assign、retain、copy)
1、assign (默认)
可修饰基本数据类型、对象类型
不做内存优化,直接赋值
- (void)setName:(NSString *)name
{
_name = name;
}
- (NSString *)name
{
return _name;
}
2、retain(最常用)
只能修饰对象类型
内部实现会做内存优化
- (void)setGender:(NSString *)gender
{
if (_gender != gender) {
[_gender release];
_gender = [gender retain];
}
}
- (NSString *)gender
{
return _gender; //等价
// return [[_gender retain] autorelease];
}
3、copy()
只能修饰遵守<NSCopying>协议的对象
内部实现会做内存优化
- (void)setGender:(NSString *)gender
{
if (_gender != gender) {
[_gender release];
_gender = [gender copy];
}
}
- (NSString *)gender
{
return _gender;
}
三、点语法
注意?点语法和属性无关
点语法适用范围
符合系统默认setter、getter书写格式的?法都可以使?点语法。
array.count;
下面为两对等价调用
[s setScore:100];
s.score = 100;
float score = [s score];
float score = s.score;
四、KVC
概念
KVC(Key-Value-Coding),键值编码,是?种间接访问实例变量的?法。
除setValuesForKeysWithDictionary方法外,均不建议使用
使用
Student *s = [[Student alloc] init];
修改值
setValue:forKey:
setValue:forKeyPath:
setValue:forUndefinedKey:
setValuesForKeysWithDictionary:
获取值
valueForKey:
valueForKeyPath:
valueForUndefinedKey:
forKey
[s setValue:@"易荟云"forKey:@"name"];//<==>s.name = @"易荟云";
QA当key不存在的时候,会执?setValue:forUndefinedKey:
在.m中写如下方法,可避免由错误key导致的崩溃
- (void)setValue:(id)value forUndefinedKey:(NSString *)key
{
NSLog(@"undefined key = %@", key);
}
[s valueForKey:@"score"]
在.m中写如下方法,可避免由错误key导致的崩溃
- (id)valueForUndefinedKey:(NSString *)key
{
return @"错误";
}
forKeyPath:
Book * b = [[Book alloc] init];
s.book = b;
b.bookName = @"ios开发";
s.book.bookName = @"oc";
NSLog(@"%@", b.bookName);
NSLog(@"%@", s.book.bookName);
// student对象给bookName赋值
[s setValue:@"你好中国" forKeyPath:@"book.bookName"];
[s valueForKeyPath:@"book.bookName"];
setValuesForKeysWithDictionary:
最常用:用于网络请求数据后,封装数据对象
NSDictionary * dic = @{@"name": @"易荟云",
@"gender": @"女",
@"age": @18,
@"number": @1,
@"score": @90};
[s setValuesForKeysWithDictionary:dic];
标签:
原文地址:http://my.oschina.net/zooyf/blog/490336