标签:
//
// 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];
// ma.name=@"张三";
//
// 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对象的名字赋值
//
// ma.women.name=@"小花";
//
// //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;
}
标签:
原文地址:http://www.cnblogs.com/huyibo/p/5475349.html