[TwistedFate]属性property

来源:互联网 发布:mac地址ip地质作用 编辑:程序博客网 时间:2024/06/10 06:36

属性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