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]);
}