1.KVC。
KVC是一种间接访问对象属性的机制,而不是直接通过设置器和访问器或者点语法来访问对象属性。
比如:创建一个学生对象。
Student * student = [[Student alloc] init];
[student setValue@"zhangsan"forKey@"_name"];//通过KVO对student对象的_name变量赋值
NSString * str = [student valueForKey@"_name"];//取出_name的数值,存放在str中
还有一种方法。比如在又定义了一个Teacher类。Teacher类里边同样有一个实例变量_name,在Student类的interface中引入Teacher类,并且创建实例变量Teacher * _t;
#import <Foundation/Foundation.h>
//#import "Teach.h"
@class Teach;//用这样的方法是为了防止执行到引入的时候发生嵌套,产生死循环。
@interface Student : NSObject
{
NSString * _name;
Teach * _t;
}
@end
Teacherl类的interface。
@interface Teach : NSObject
{
NSString * _name;
NSString * _address;
}
@end
在主函数中。
Teacher * teacher = [[Teacher alloc] init];//创建一个teacher对象。
[student setValue@"teacher"forKey@"_t"];//次数的teacher对象是上边刚刚创建的那个teacher对象
[student setValue@"lisi"ForKeyPath@"_t.name"];//表示路径
NSString * str1 = [student valueForKeyPath@"_t.name"];//通过student来存取teacher中的变量_name.
NSString * str2 = [teacher valueForKey@"_name"];//当输出str2的时候结果和str1是相同的都是“lisi”。
2.KVO。
当对象的某一个属性发生变化的时候,我们得到一个相应的通知。
主函数中:
Teach * teacher = [[Teach alloc]init];
teacher.name = @"abc";//在声明文件中声明了name属性。所以直接使用点语法赋值
[teacher addObserver:teacher //teacher为事件的监听者,此处就是注意谁监听谁实现后边的 监听触发以后的方法。
forKeyPath:@"name" //便是监听的哪一个属性
options:NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld//得到什么值
context:nil];
teacher.name = @"123";//一旦name发生变换,就进入到teacher的实现文件(.m)中调用方法
teacher.name = @"456";//每次都会调用那个方法,,实时更新
在Teacher类的.m文件中
#import "Teach.h"
@implementation Teach
@synthesize name = _name;
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
NSLog(@"keyPath:%@, object:%@ change:%@ context:%@",keyPath,object,change,context);
}
@end
打印结果:
2012-08-13 08:48:34.162 KVC[422:14503] keyPath:name, object:<Teach: 0x8a3ee10> change:{
kind = 1;
new = 123;
old = abc;
} context:(null)
2012-08-13 08:48:34.164 KVC[422:14503] keyPath:name, object:<Teach: 0x8a3ee10> change:{
kind = 1;
new = 456;
old = 123;
} context:(null)
3.NSNotification 通知
NSNotification的对象很简单,就是poster要提供给observer的信息包裹。
在主函数中创建监听通知的过程。
NSNotificationCenter * center = [NSNotificationCenter defaultCenter];//通过单例得到通知中心,相当于通知在什么地方发布(黑板)
Teach * teacher = [[Teach alloc]init];
[center addObserver: teacher selector:@selector(test:) name:@"黑苹果" object:nil];//self是监听者,selector是表示监听到一个通知以后需要执行里边的test:方法。name表示需要监听的通知是什么内容。object表示监听通知的发出者。
NSNotification * notification1 = [NSNotification notificationWithName:@"黑苹果" object:teacher userInfo:nil];创建一个通知
[center postNotification:notification]//通过上边建立的通知中心center发布通知notification1.
[center postNotificationWithName:@"黑苹果" object:teacher userInfo:nil]//作用相当于上边2行代码。
在监听者teacher的.m文件加加入test:方法
-(void)test:(NSNotification *)n
{
NSLog(@"name : %@ boject = %@ userInfo = %@",[n name],[n object],[n userInfo]);
}
打印结果:
2012-08-13 09:13:35.328 KVC[452:14503] name : 黑苹果 boject = <Teach: 0x6b2b350> userInfo = (null)