进击的KFC:OC(八)属性、点语法、KVC

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

        属性的声明:使⽤@property声明属性
        例如:@property NSString *name;
        相当于@interface中声明了两个⽅法(settergetter):
        - (void)setName:(NSString *)name;
         - (NSString *)name

3.属性的实现

        属性的实现:使⽤@synthesize实现属性
        例如:@synthesize name = _name;
        相当于@implementation实现了settergetter
        - (void)setName:(NSString *)name
         {…}
        - (NSString *)name
         {…}

⼆、属性的属性
1.Objective-C提供属性的⺫的是为了简化程序员编码.
为属性提供了⼀些关键字⽤以控制setter、getter的实现细节.
这些关键字我们称为属性的属性(attribute)
⼀共3⼤类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;
readwrite是读写性控制的默认设置。

第⼆类:原⼦性控制(nonatomic、atomic)
   atomic。setter、getter⽅法在多线程访问下是绝对安全的,即     setter、getter内部做了多线程访问处理。原⼦性控制的默认设置是atomic
    nonatomic。setter、getter⽅法内部不会做多线程访问处理,仅仅是普通的setter、getter⽅法. 
    程序开发过程中,setter、getter处处都在⽤,如果使⽤atomic,需要不断的对setter、getter加锁解锁以保证线程访问安全,会很占⽤系统资源,降低系统性能。通常设置为nonatomic,某些属性需要线程安全的时候,才定义为atomic。
例如:@property (readwrite,nonatomic)NSString *name;
//等价于
- (NSString *)name;
- (void)setName:(NSString *)name;

第三类:语义设置(assign、retain、copy)
assign:setter,getter内部实现是直接赋值。
// 如果属性是⾮对象类型(⽐如int,float等)属性的语义设置使⽤
assign。
例如:@property(nonatomic,assign)NSString *name;
- (void)setName:(NSString *)name{
 _name = name;
}
- (NSString *)name{
 return _name;
}

retain:setter、getter的内部实现会做内存优化。
// 如果属性是对象类型(⽐如NSStrng、NSArray等)属性的语义设
置使⽤retain。
例如:@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的内部实现也会做内存优化。
// 如果属性是对象类型并且想得到参数的copy,使⽤copy关键字。
例如:@property(nonatomic,copy)NSString *name;
- (void)setName:(NSString *)name{
 if(_name != name){
 [_name release];
 _name = [name copy];
 }
}
- (NSString *)name{
 return [[_name retain]autorelease];
}

三、点语法

点语法是Objective-C 2.0中定义的语法格式。提供了⼀种便捷的
属性访问⽅式。

点语法的使⽤:

       凡是符合系统默认setter、getter书写格式的⽅法都可以使⽤点语法。
       例如:[person1 setName:@”zhangsan”];可以等价写成
            person1.name = @”zhangsan”;。
            NSString *name = [person1 name];可以等价写成NSString *name = person1.name;
            属性是⼀对getter、setter⽅法,点语法是属性的另⼀种调⽤格式。
            // 等号左边 调用的是set方法 赋值
            // 等号右边 调用的是get方法 取值

四、KVC
KVC(Key-Value-Coding),键值编码,是⼀种间接访问实例变量的⽅法。
key:键,⽤于标识实例变量.
vlaue:实例变量对应的值.

修改值方法:

setValue:forKey:
setValue:forKeyPath:
setValue:forUndefinedKey:
setValuesForKeysWithDictionary:
// 传入的key的查找顺序:_key _iskey key iskey

获取值方法:

valueForKey:
valueForKeyPath:
valueForUndefinedKey:
注意事项:
     当key不存在的时候,会执⾏setValue:forUndefinedKey:
     系统默认实现是抛出⼀个异常

总结:
属性是Objective-C的重要语法,属性是⼀组getter、setter⽅法,内
部对实例变量进⾏操作。
点语法是⼀种属性的另外⼀种调⽤格式。
KVC是⼀种间接访问实例变量的⽅法。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值