Objc-C 知识点回顾 九 Property

来源:互联网 发布:星图软件 编辑:程序博客网 时间:2024/05/16 09:27
1.属性        //属性:为你自动生成setter和getter        //能在⼀定程度上简化程序代码,并且增强实例变量的访问安全性        //属性声明的写法        //@property 数据类型 实例变量名;               //属性实现的写法        //@synthesize 实例变量名;       2.属性的修饰符        //修饰符, 实质是对setter和getter方法的限定               //(1)线程安全组        //nonatomic: 非原子性(不对多线程进行管理, 效率高)        //atomic: 原子性(在多线程下使用, 保证线程安全, 但效率会很低)        //注:a.默认值:atomic, 一般使用nonatomic        //  b.atomic修饰的属性, 要么同时重写setter和getter, 要么都不重写; 不允许只重写其中一个方法               //(2)内存管理组        //assign(默认值)        //retain        //copy        //weak        //strong               //week和strong在ARC下才能够使用        //基本数据类型用assign        //对象用retain, weak, strong        //既是对象, 并且对象遵循协议, 才能使用copy        //注:delegate写成属性, 在ARC下用weak, 在MRC下用assign               //(3)读写组        //readwrite(默认值)可读写, 生成setter和getter        //readonly:只读, 只生成getter               //(4)方法重命名组        //setter=方法名        //getter=方法名        //注:重新修改setter和getter的名字, 不影响点语法的使用       3.点语法        //点语法是setter 和 getter的快捷调用方法        //属性是⼀对getter、setter方法,点语法是属性的另一种调用格式        //如果点语法出现在赋值等号的左侧, 调用setter; 其他位置, 调用getter4.KVC        //KVC(Key-Value-Coding),键值编码,是一种间接访问实例变量的方法        //设置        [man setValue:@"lisi" forKey:@"name"];        //获取        NSLog(@"%@", [man valueForKey:@"name"]);               //通过KVC访问属性, key是属性名, 如果key写错, 会导致程序崩溃        NSLog(@"%@", [man valueForKey:@"anme"]);        [man setValue:@"aaa" forKey:@"mena"];        //当key不存在的时候,会执⾏setValue:forUndefinedKey:               Man *man1 = [[Man alloc] initWithName:@"王五" work:@"家里蹲" age:25];        NSLog(@"%@", man1);               //KVC通过字典对多个属性赋值        Man *man2 = [[Man alloc] init];        NSDictionary *dic = @{@"name":@"123", @"age":@26, @"work":@"学习"};        [man2 setValuesForKeysWithDictionary:dic];        NSLog(@"%@", man2);               Father *father = [[Father alloc] init];        father.work = @"移动互联";               Son *son = [[Son alloc] init];        son.play = @"玩球";               father.son = son;        NSLog(@"%@", [father valueForKey:@"work"]);        NSLog(@"%@", [son valueForKey:@"play"]);        NSLog(@"%@", [father.son valueForKey:@"play"]);        NSLog(@"%@", [[father valueForKey:@"son"] valueForKey:@"play"]);               //通过keypath访问属性(可以使用点语法)        NSLog(@"%@", [father valueForKeyPath:@"son.play"]);        //通过keypath设置属性        [father setValue:@"玩气球" forKeyPath:@"son.play"];               Father *father1 = [[Father alloc] init];        father1.work = @"卖糖葫芦";        Son *son1 = [[Son alloc] init];//Son *son1;//对象没有开辟内存, 初始化, 对其设置属性或调用方法, 都是无效的        son1.play = @"和尿泥";        father1.son = son1;        NSLog(@"%@", [father1 valueForKey:@"work"]);        NSLog(@"%@", [son1 valueForKey:@"play"]);               Girl *girl1 = [[Girl alloc] init];        girl1.age = 16;               Girl *girl2 = [[Girl alloc] init];        girl2.age = 18;               Girl *girl3 = [[Girl alloc] init];        girl3.age = 20;               NSArray *array = @[girl1, girl2, girl3];               //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"]);

0 0