ObjectC----Property,Attribute,点语法,KVC,KVO

本文深入探讨了Objective-C中的属性与属性的属性(attribute)的概念,包括Property属性、读写性控制(readonly、readwrite)、原子性控制(nonatomic、atomic)和语义设置(assign、retain、copy)。同时介绍了KVC(键值编码)和KVO(键值观察)的基本原理及使用方法。并通过实例代码展示了如何在实际开发中应用这些概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 // 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:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值