OC-属性property

属性:自动生成setter和getter
声明:@property 数据类型 实例变量名
属性实现的写法,如果类型相同,可以用,隔开,但是类型如果像NSString这种类型的实例变量,需要加*
@synthesize 实例变量名
如果不写@synthesize, 系统默认生成下面代码
@synthesize name = _name;
再自动生成实例变量 NSString *_name;
如果系统的setter不能满足需求,可以重写setter方法和getter方法
时刻谨记:使用点语法,出现在等号的左边,表示的是调用设置器,出现在其他地方,表示的是调用访问器
- (void)setName:(NSString *)name {
    //1
    _name = name;
    //2
    //self.name = name;//error,setter 方法中不能够用 self. 对实例变量赋值 , 会造成死循环 // 面试题
    NSLog(@"Hello World”);
}
     - (NSString *)name {   
    //1
    return _name;
    //2
    //return self.name;//error错误原因同上
    }
如果由系统自动生成@synthesize,重写setter和getter方法,只能重写其一,两个都重写,系统的@synthesize自动失效
解决方案:如果重写setter和getter方法,自己来写@synthesize

属性的修饰符
修饰符:实质是对setter和getter方法的限定
1.线程安全组
nonatomic:非原子性,不对多线程进行管理,效率高
atomic:原子性,多线程下使用,保证线程安全,但效率低
注:a.默认为atomic,一般使用nonatomic
b.atomic修饰的属性,要么重写setter和getter,要么都不重写,不允许重写其中的一个方法
2.内存管理组
assign:
retain:
copy:
weak:
strong:
weak和strong是在ARC下才能使用
基本数据类型用assign(默认值)
对象用retain, weak, strong
即是对象,并且对象遵守<NScoping>协议,才能使用copy
注:delegate:写成属性,在ARC下用weak,在MRC下用assign
3.读写组
readwrite(默认值):可读写,生成setter和getter方法
readonly:只读,只生成getter方法
4.方法重命名
setter = 方法名
getter= 方法名
注:重新修改setter和getter方法的名字,不影响点语法的使用
//ARC
@property (nonatomic, weak)id<LoveDelegate>delegate;
//MRC
@property (nonatomic, assign)id<LoveDelegate>delegate1; }
}

KVC:key-value coding, 键值编码,提供 一种间接访问属性的方法
// 间接访问属性 (KVC)
 // 设置
 [man setValue:@"lisi" forKey:@"name"];
// 获取
NSLog(@"%@", [man valueForKey:@"name"]);
        
 // 通过 KVC 访问属性 , key 是属性名 , 如果 key 写错 , 会导致程序崩溃
  NSLog(@"%@", [man valueForKey:@"aname"]);
  [man setValue:@"aaa" forKey:@"mena”];
// 通过 key 查找对应的 value , 如果找不到对应的 key, 就会走这个方法
// 重写这个方法能够避免 , 如果写错了 key, 而导致系统崩溃
- (id)valueForUndefinedKey:(NSString *)key {
    return nil;
   //return @" 找不到了吧 ! 写错了吧 !";
}

- (void)setValue:(id)value forUndefinedKey:(NSString *)key {
    NSLog(@" 没有这样的 key ”);
}
//KVC 通过字典对多个属性赋值
        Man *man2 = [[Man alloc] init];
        [man2 setValuesForKeysWithDictionary:@{@"name": @"123", @"age": @18, @"Job":@"study"}];
        NSLog(@"%@", man2);
//son是一个类 father是一个类 father中有个变量是son
// 通过 keypath 访问属性
        NSLog(@"%@", [father valueForKeyPath:@"son.play"]);
        [father setValue:@"heihei" forKeyPath:@"son.play"];
        NSLog(@"%@", [father valueForKeyPath:@"son.play"]);
}
//KVC 在数组中的使用
        NSLog(@"%@",[array valueForKey:@"@count"]);
        NSLog(@"%@", [array valueForKeyPath:@"@max.age"]);
        NSLog(@"%@", [array valueForKeyPath:@"@min.age"]);
        NSLog(@"%@", [array valueForKeyPath:@"@avg.age"]);
        NSLog(@"%@", [array valueForKeyPath:@"@sum.age"]);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值