oc 属性、点语法、KVC

⼀、属性

概念

属性是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 (默认)

可修饰基本数据类型对象类型

delegate使用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];


转载于:https://my.oschina.net/zooyf/blog/490336

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值