// // main.m // 第8讲 // / #import <Foundation/Foundation.h> #import "teacher.h" #import "classes.h" #import "man.h" #import "woman.h" #import "Student.h" #import "Card.h" /* 类簇: 多个类的组合,多个类来实现一个类的功能,相当于一个家族,派出一个代表,NSString,NSArray,NSDictionary,NSSet,都是对应的家族代表(代言人),但是oc中只允许但继承,一个类智能集成字一个父类,所以类簇不能有子类 */ int main(int argc, const char * argv[]) { //创建一个classes对象 // classes *lanou13=[[classes alloc] init];//0--1; // //创建teacher 对象 // teacher *teache=[[teacher alloc] init]; // NSLog(@"teachecont=%ld",teache.retainCount); // // // teache.name=[NSString stringWithFormat:@"xiaoli"]; // // lanou13.teache=teache;//1--2; // //原因 属性调用setter方法时,内部做了一次retain的操作 // NSLog(@"teachecont=%ld",teache.retainCount); // // //释放 // [lanou13 release];//1--0 // // NSLog(@"teachecont=%ld",teache.retainCount);//因为teache对象在lanou13对象销毁时,已经release够一次所以会由2--1. //teacher *tea=[teacher teacherWithName:@"xiaobai" gender:@"m" age:27]; //便利构造器内存管理--内部使用alloc 内部使用autorelease 外部无需管理内存 //集合内存管理:(数组,字典,集合) /* 集合内存管理: 1.当往集合内添加元素(对象)时,呢么相应的对象引用计数会+1(会对添加的对象做一次retain操作) 2.当移除集合内的一个元素(对象)时,被移除的对象引用计数会-1(会对被移除的对象做一次release操作) 3.当该集合的引用计数为0时,在=销毁几个对象之前,会对集合内部的所有元素对象发送一个release消息,也就是集合内部的元素对象引用计数都会-1; */ // // teacher *tea1=[[teacher alloc]init];//0--1 // teacher *tea2=[[teacher alloc]init]; // teacher *tea3=[[teacher alloc]init]; // // // //创建可变数组,将teacher对象添加到数组当中 // // NSMutableArray *teaMutArr=[[NSMutableArray alloc]initWithCapacity:0];//0--1 // NSLog(@"tea1count=%lu",tea1.retainCount); // NSLog(@"teaMutArrcount=%lu",teaMutArr.retainCount); // // //将我们teacher对象添加到数组当中 // // [teaMutArr addObject:tea1];//1--2 // NSLog(@"tea1count=%lu",tea1.retainCount); // [teaMutArr addObject:tea2];//1--2 // [teaMutArr addObject:tea3];//1--2 // NSLog(@"teaMutArrcount=%lu",teaMutArr.retainCount); // //相应release一次 // [tea1 release];//2--1 // [tea2 release];//2--1 // [tea3 release];//2--1 // [teaMutArr release]; // //teaMutArr 1--0 销毁时,会向tea1, tea2, tea3 对象个发送一次release消息 // NSLog(@"teaMutArrcount=%lu",teaMutArr.retainCount); // NSLog(@"tea1count=%lu",tea1.retainCount); // /* ARC系统管理内存: ARC:自动引用计数(系统自动管理内存),由我们开发人员去开辟内存空间,但是不需要释放该内存空间,系统会自动释放该内存空间,本质上还是基于MRC的,只不过系统会自动添加了释放内存的方法,它不是垃圾回收机制 */ /* KVC:Key Value 它是间接访问实例变量的方式,为对象中对应的实例变量赋值调用setValue:forkey: */ // // man *ma=[[man alloc]init]; // [email protected]"张三"; // // NSLog(@"%@",ma.name); // // //使用KVC赋值过程 // [ma setValue:@"李四" forKey:@"name"]; // // //使用KVC取值 // NSString *name1=[ma valueForKey:@"name"]; // NSLog(@"%@",name1); // // woman *wom=[[woman alloc]init]; // //将女人指定为男人的妻子 // [ma setWomen:wom]; // // //KVC: // // [ma setValue:wom forKey:@"wom"]; // // // //通过man对象为其中的woman对象的名字赋值 // // [email protected]"小花"; // // //KVC // [ma setValue:@"如花" forKeyPath:@"wom.name"]; // // // NSLog(@"name=%@",[ma valueForKeyPath:@"wom.name"]); Student *s=[[Student alloc]init]; [s setName:@"小白"]; [s setName:@"小丽"]; //KVC方法 [s setValue:@"小花" forKey:@"name"]; [s setValue:@"男" forKey:@"sex"]; [s setValue:@"一米二" forKey:@"height"]; NSLog(@"height=%@",[s valueForKey:@"height"]); Card *c=[[Card alloc]init]; [s setValue:c forKey:@"card"]; //student想要访问card里面 number变量 //这里相当于是通过路径也就是card的属性number,然后将值赋值给他 [s setValue:@"123456" forKeyPath:@"card.number"]; NSLog(@"%@",[s valueForKeyPath:@"card.number"]); /* setvlaue : forkey: key是不能传入路径card.number setvlaue : forkeypath: keypath是可以传入key的(也就是可以传入路径) */ //直接全部赋值 [s setValuesForKeysWithDictionary:@{@"name":@"小丽",@"age":@"18",@"hobby":@"吃辣条",@"height":@"一米二"}]; NSLog(@"%@",[s valueForKey:@"hobby"]); return 0; }
时间: 2024-10-02 01:19:12