KVC和KVO的演示

//
//  CZViewController.m
//  09-KVC&KVO
//
//  Created by apple on 11/07/14.
//  Copyright (c) 2014itcast. All rights reserved.
//

#import"CZViewController.h"
#import
"CZPerson.h"
#import
"CZStudent.h"
#import
"CZBook.h"

@interface CZViewController()
@property(nonatomic,strong)CZStudent*student;
@end

@implementationCZViewController
/**
 1> KVC - Key Value Coding
鍵值(路徑)編碼
 
 KVC
是一種間接修改/讀取對象屬性的一種方式
 
 KVC
被稱爲蘋果開發的大招!
 
 KVC
在使用時,須要注意,鍵值名稱在對象屬性中必須存在,不然會崩潰!
 
 2> KVO - Key Value Observer
鍵值觀察(觀察者模式)
 
通知中心一樣也是觀察者模式
 
 */

- (
void)viewDidLoad
{
    [
superviewDidLoad];
   
   
// student
   
CZStudent*student = [[CZStudentalloc]init];
   
self.student= student;
   
    student.
name=@"mary";
    student.
age=19;
    student.
no=@"001";
   
   
//觀察student的屬性變化
   
// 1> self     負責監聽的對象        NSNotificationCenter是由通知中心負責
   
// 2> keyPath  要觀察的屬性鍵值路徑,KVO主要用於對模型屬性變化進行觀察的一種模式
   
//       通知中心是經過對象POST字符串給通知中心來達到觀察目的的
   
// 3>選項"|"(而且)位運算,能夠同時支持多個選項
   
// 4>上下文
    [student
addObserver:selfforKeyPath:@"name"options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOldcontext:@"hello"];
   
    student.
name=@"rose";
}

//分類:又被稱爲:隱式代理,靈活度很高,可是代碼的可讀性很差,不建議使用!
// delegate ->顯式代理
//
//觀察監聽方法,全部的監聽事件發生時,都統一調用監聽者的此方法!
// 1> keyPath  觀察的鍵值路徑
// 2> object   觀察的對象
// 3> change   改變,新、舊數值發送過來
// 4> context  上下文,創建觀察時指定的上下文,若是同時監聽多個屬性,能夠經過上下文加以區分
- (
void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context
{
   
NSLog(@"%@ %@ %@ %@", keyPath, object, change, context);
}

- (
void)demoKVC3
{
   
// student
   
CZStudent*student = [[CZStudentalloc]init];
    student.
name=@"mary";
    student.
age=19;
    student.
no=@"001";
   
   
CZBook*book = [[CZBookalloc]init];
    book.
bookName=@"iOS";
    student.
book= book;
   
   
// student1
   
CZStudent*student1 = [[CZStudentalloc]init];
    student1.
name=@"rose";
    student1.
age=29;
    student1.
no=@"002";
   
   
CZBook*book1 = [[CZBookalloc]init];
    book1.
bookName=@"iPhone";
   
    student1.
book= book1;
   
   
NSArray*students =@[student, student1];
   
NSLog(@"%@", students);
   
   
//需求,將兩個學生的姓名生成一個數組
   
//    NSMutableArray *arrayM = [NSMutableArray array];
   
//    for (CZStudent *stu in students) {
   
//        [arrayM addObject:stu.name];
   
//    }
   
//    NSLog(@"%@", arrayM);
   
//KVC取值
   
//使用KVC取值的時候,若是當前對象不包含指定的鍵值
   
//那麼KVC會進入對象內部,繼續搜索!
   
NSLog(@"%@", [studentsvalueForKeyPath:@"name"]);
   
NSLog(@"%@", [studentsvalueForKeyPath:@"book.bookName"]);
}

- (
void)demoKVC2
{
   
CZStudent*student = [[CZStudentalloc]init];
    student.
name=@"mary";
    student.
age=19;
    student.
no=@"001";
   
   
CZBook*book = [[CZBookalloc]init];
    book.
bookName=@"iOS";
   
    student.
book= book;
   
   
NSLog(@"%@", student);
   
   
//使用KVC來給對象賦值
    [student
setValue:@"rose"forKeyPath:@"name"];
   
//給數值型屬性賦值時,一樣能夠使用字符串
    [student
setValue:@"16"forKeyPath:@"age"];
   
    [
selfdemo:student];
   
   
NSLog(@"%@", student);
}

- (
void)demo:(CZStudent*)student
{
   
//使用KVCBook賦值
//    CZBook *book = student.book;
//    book.bookName = @"iPhone";
    [student
setValue:@"iPhone"forKeyPath:@"book.bookName"];
}

- (
void)kvcDemo1
{
   
CZPerson*p = [[CZPersonalloc]init];
    p.
name=@"mary";
    p.
age=19;
   
   
NSLog(@"%@", p);
   
   
//使用KVC來給對象賦值
    [p
setValue:@"rose"forKeyPath:@"name"];
   
//給數值型屬性賦值時,一樣能夠使用字符串
    [p
setValue:@"16"forKeyPath:@"age"];
   
   
NSLog(@"%@", p);
}

@end
數組

相關文章
相關標籤/搜索