KVC
[对象 setValue:aValue forKey:aKey];//为对象的aKey变量赋值
aValue = [对象 valueForKey:aKey];//把对象的aKey变量的值取出来
[对象 setValue:aValue forKeyPath:aKeyPath];//设置值
id aValue = [对象 valueForKeyPath:aKeyPath];//取值
注意:keyPath里边的变量!aKeyPath填 p.name之类的(可以很多点)
Demo:
Student *stu = [[Student alloc]init];
[stu setValue:@"张三"forKey:@"name"];//对对象变量赋值
NSString s1 = [stu valueForKey:@"name"];//变量值取出
[stu release];
KVO
1、注册监听
[被监听对象 addObserver:监听者
forKeyPath:被监听对象的属性
options:监视内容(新值或旧值)
context:额外信息];
2、监听者实现监听方法(在监听者的类里面实现,不实现会崩溃)
-(void)observerValueForKeyPath:(NSString*)keyPath ofObject:(id)object (被监听对象) change:(NSdictionary*)change(所监对象属性变化) context:(void*)context
3、监听触发条件
被监听对象的属性发生变化时 //自动调用下面的方法
Demo:
-(void)observerValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context
{
NSLog:(@"keyPath:%@ object:%@ change:%@ context:%@ ",keyPath,object,change,context); //可以在这方法里实现想做的事 比如发送通知
}
Student *stu = [[Student alloc]init];
stu.name = @"张三";
【stu addObserver self forKeyPath :@"name" options:NSKeyValueObservingOptionNew context:nil】;
stu.name = @"李四"; //值改变调用方法
stu.name = @"王五"; //值改变有调用方法
【stu release】;
通知
1、获得通知中心对象
NSNotificationCenter *center= [NSNotificationCenter defaultCenter]; //单例实际是获得通知中心的地址
2、监听通知
[center addObserver :监听者 selector:须执行的方法 name:所监听者通知的名称 object:通知发送者];
3、通知中心发布消息
[center PostNotificationName:@"国王万岁" object:某人];
4.移除监听中心
[center removeObserver:self name:@"国王万岁" object:某人];
Demo:
King *king = [[King alloc]init];
Farmer *farmer = [[Farmer alloc]init];
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:farmer selector:@selector(test:) name:@"国王万岁" object:king];
[center postNotificationName:@"国王万岁" object:king];
[center removeObserver:farmer];
[king release];
[farmer release];
-(void)test:(NSNotification*)n //方法必须实现 在监听通知的类里面 做想做的事
{
NSLog(@"name:%@ object:%@ userInfo:%@",[nname],[n object],[n userInfo]);
}