码迷,mamicode.com
首页 > 其他好文 > 详细

oc 属性、点语法、KVC

时间:2015-08-10 20:24:21      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:

?、属性

概念

属性是Objective-C 2.0定义的语法,为实例变量提供了setter、 getter?法的默认实现。能在?定程度上简化程序代码,并且增强实例变量的访问安全性

定义

@interface Person : NSObject

@property 属性的类型 属性的名字

@end  

等价

{

    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;

相当于numbersetNumber:方法名改为nn:

getter

给编译器指定getter方法名。getter仅在BOOL类型的属性中使用。

例如:

@property (getter=isDeath)BOOL death;

相当于deathgetter方法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];


oc 属性、点语法、KVC

标签:

原文地址:http://my.oschina.net/zooyf/blog/490336

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!