OC第八天 属性 点语法 KVC

属性:
声明属性关键字: @property
如果你的实例变量_name 那么你声明属性时去掉下划线
如:@porperty(nonatomic,retain) NSString *name;
声明成属性代表系统默认实现setter,getter方法声明

默认属性的实现 关键字@synthesize
等号前面 代表 你声明属性的名称
等号后面 代表 你要赋值成员变量的名称
@synthesize name = _name

**

注:声明属性是默认实现setter,getter方法的,你不再.m文件实现话就默认是实现的,但是你如果想要在.m文件
实现的话就必须加上@synthesize,不然setter,getter方法实现不了

**
属性的属性:
1.读写属性
readonly 只读 (系统默认不生成set方法了)
readwrite 读写 (如果你什么都不写 默认的就是读写)
setter 设置指定set方法 默认就会生成你指定的set方法名
@property(readwrite,setter = aa:)NSString *name 这里需要注意的是方法名后面需要加冒号
getter 设置指定get方法 默认生成的方法名
@property(getter = isOpening)BOOL opening 调用的时候就是isOpening 主要的应用场景:BOOL类型

2.原子性控制
nonatomic 没有实现多线程同时访问一个变量的操作保护
atomic(如果什么都不写 默认的)添加多线程的保护操作(避免你在干某件事的时候,另一个人过来)虽然安全,但是大量耗费系统资源 并且这些资源是不必要的浪费,所以一般使用 nonatomic

3.语义性设置
注意:创建工程 默认是ARC状态(自动管理内存)
手动管理内存 MRC
assign set get方法的实现 是直接赋值的 一般用在基本数据类型的时候使用
retain set get方法的实现 内部实现对内存管理的优化 对象类型声明为retain
例: -(void)setName:(NSString *)name
{
if(_name != name)
{
[_name release];
_name = [name retain];
}
}
- (NSString *)name
{
return [[_name retain]autorelease];
}
copy 与 retain一样 但是声明成copy 有一个先决条件 必须遵守NSCopying协议 并且实现其方法
例: -(void)setName:(NSString *)name
{
if(_name != name)
{
[_name release];
_name = [name copy];
}
}
- (NSString *)name
{
return [[_name retain]autorelease];
}

点语法 提供了一个快捷的访问属性的一种方法
快捷调用set get方法
等号左边 调用的是set方法 赋值
等号右边 调用的是get方法 取值

KVC key - value - coding

间接方法 访问属性 做到赋值取值
传入的key的查找顺序
_key _iskey key iskey

复合: 本类中有其他类的一个对象 作为本类的实例变量

setValue:forKey: 查找关键字赋值(给属性赋值)
setValue:forKeyPath: forKeyPath这个方法 相当于跨一级去间接访问属性 是访问本类中属性的属性 通过这个方法去访问的话 需要传入一个路径 通过这个途径一级级查找
setValue:forUndefinedKey: 间接访问属性是需要重写这个方法 因为如果没有查找到那个属性时 程序会奔溃
setValuesForKeysWithDictionary: 通过一个字典 去间接赋值 一个对象

获取值:
valueForKey:
valueForKeyPath:
valueForUndefinedKey

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值