[TwistedFate]属性property

属性property

声明

如果你的实例变量是_name,那么你生成属性时把下划线去掉可以

@property (retain, nonatomic) NSString *name;

默认属性实现:关键字@synthesize

又称合成set get方法,相当于实现set get方法

@synthesize name = _name;

等号前面代表声明属性的名称,等号后面代表要赋值成员变量的名称

属性的属性

读写类属性

  • readonly 只读(系统就不会默认生成set方法)
  • readwrite 读写(缺省 系统默认为可读写)
  • setter 设置指定的setter方法(方法名) 默认生成方法名
@property (readwrite, setter = aa:, getter = bb, retain) NSString *name;
  • getter设置指定 get方法 默认生成的方法名(BOOL类型一般用到)
@property (getter = isOpening)BOOL opening;

原子性控制

  • nonatomic 没有实现多线程同时访问一个变量操作保护
  • atomic (缺省 默认)添加对多线程的保护操作 虽然安全 但是大量耗费系统资源 并且这些资源是不必要浪费的 所以一般使用nonatomic

语义性设置

注意:创建工程 默认是ARC状态(自动管理内存)
手动管理内存 MRC 引用计数管理(下一章有介绍)
- assign:set和get方法的实现 是直接赋值的 一般用于基本类型
- retain:内部set get方法的实现 内部实现了对内存管理的优化 一般用于对象类型

// set方法和get方法的完整实现
- (void)setName:(NSString *)name{
    if (_name != name) {
        [_name release];
        _name = [name retain];
    }
}
- (NSString *)name{
    return [[_name retain] autorelease];
}
  • copy:与retain一样 但是必须遵守NSCopying协议的对象类型 并且实现其方法
@property (nonatomic, copy) NSString *sex;
- (void)setSex:(NSString *)sex{
    if(_sex != sex)
    [_sex release];
    _sex = [sex copy];
}
- (NSString *)sex{
    return [[sex retain] autorelease];
}

点语法

点语法提供了一个快捷的访问属性方式
实质就是快捷调用了set get方法
等号左边 调用是set方法;等号右边调用的get方法

KVC键值码

间接访问属性的方法

创建一个 Student对象 进行赋值 取值

setValue:forKey:

[stu setValue:@"king" forKey:@"name"];
// NSInteger类型需要转化为NSNmuber类型
NSNumber *num = [NSNumber numberWithInt:18];
[stu setValue:num forUndefinedKey:@"age"];
[stu setValue:@18 forKey:@"age"];
[stu setValue:nil forKey:@"age"];

传入key的查找顺序

传入key查找顺序:
 _key _iskey key iskey

setValue:forKeyPath:

[stu setValue:@"htc" forKeyPath:@"phone.name"];

forKeyPath 这个方法 相当于 跨一级区间接访问属性 是访问本类中属性的属性 通过这个方法去访问的话 需要传入一个路径,填入这个路径 一级一级的进行查找

setValue:forUndefinedKey:

间接赋值的保护方法
赋值的时候key填错了

- (void)setValue:(id)value forUndefinedKey:(NSString *)key{
    // 如果你使用间接访问的方法 访问属性的话 需要重写这个方法 防止在抛出异常的时候调用这个方法的时候没有 而产生崩溃
}
NSLog(@"%@ %@",value, key);
// 捕获间接访问属性时 填错的key 和 value
// 如果使用间接访问 那么必须实现这个方法

setValuesForKeysWithDictionary:

// 通过一个字典去间接赋值 一个对象
// 一个字典 完成赋值对象
NSDictionary *dic = @{@"name":@"king",@"sex":@"男"};
[stu setValuesForKeysWithDictionary:dic];  // 从网上请求

valueForUndefinedKey:

取值的时候key填错了调用这个方法

setNilValueForKey:(NSString *)key

setNilValueForKey:(NSString *)key{
   // 捕获到value是空的 对应的key
    NSLog(@"%@",key);
//    if ([key isEqualToString:@"age"]) {
//        _age = 19;
//    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值