[oc學習日記]kvc,kvo和通知,kvckvo

來源:互聯網
上載者:User

[oc學習日記]kvc,kvo和通知,kvckvo

KVC索引值對編碼

kvc索引值對編碼就是在對象沒有聲明屬性(畢竟能用點方法沒幾個人會再去用kvc),成員變數沒有公有化,並且沒有寫描述方法時使用的一種給成員變數或者屬性賦值的一種方式。

例如:

        //我們建立了一個學生類,並將其執行個體化        Student *stu = [[Student alloc]init];        //給學生隊形的name成員變數使用kvc賦值        [stu setValue:@"ss" forKey:@"name"];        //取出使用索引值對進行賦值了的name成員變數的值        NSLog(@"%@",[stu valueForKey:@"name"]);

 

如果此時學生有一本書,並且這個書有名字,那我們該怎麼在學生對象中輸出這本書的名字呢

        //首先要用下面這個方法給書的名字進行賦值        [stu setValue:@"語文" forKeyPath:@"book.name"];        //而且要在學生類中定義一個book類的對象,而且這個變數的name的成員變數必須要添加@public或者定義屬性,否則學生類中無法訪問book的name        Book *book ;

KVO索引值觀察

沒有kvc就沒有kvo,當對象屬性或者成員變數的值通過kvc發生變化時,kvo就會觀察到值的變化,並且做出反應

kvo有三個步驟:

要另外寫一個觀察者類

1.註冊成為觀察者

1 -(void)registerWatch{2     //第一個參數:被觀察的對象,第二個參數:觀察者的對象,第三個參數:被觀察的對象的屬性或者變數名,第四個參數:接收到變化的通知時,給我們展示的內容3     [_stu addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];4 }

2.重寫observeValueForKeyPath方法

1 -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{2     NSLog(@"%@",keyPath);//(被觀察者)發生改變的變數或屬性名稱3     4     NSLog(@"%@",object);//被觀察者5     NSLog(@"%@",change);//屬性或變數改變前後的值(字典)new:改變後   old:改變前6     NSLog(@"%@",[change objectForKey:@"new"]);7 }

3.移除kvo

-(void)dealloc{    //移除kvo    [_stu removeObserver:self forKeyPath:@"name"];}

如何使用kvo:

在主函數中執行個體化一個觀察者對象,將其註冊成為觀察者對象

如果被觀察者的成員變數活著屬性發生變化就會根據observeValueForKeyPath方法輸出相應內容

 

通知

通知模式就是通知中樞發送資訊,如果觀察者(接受資訊者)監聽(接收)到了資訊,那麼會做出一定的回應

通知模式的使用:

1. 註冊通知

-(void)addNotifi{    //在通知中樞註冊通知:第一個參數,代表通知接收對象,第二個參數:代表接收到通知後調用的方法,第三個參數:代表通知的名字 最後一個參數不用管,直接給nil    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receive:) name:@"Notifi" object:nil];}

 2.接收到資訊作出反應的方法

//如果通知包含參數,那麼方法定義時,需要一個通知的對象作為參數-(void)receive:(NSNotification *)note{       NSLog(@"收到通知");//    NSLog(@"%@",note.object);//此處的note.object就代表發送通知時傳過來的資訊    //    傳過來的是什麼類型的參數,我們就用什麼類型的變數進行處理//    NSDictionary *dic = note.object;//    NSLog(@"--%@",dic);        NSLog(@"%@",note.userInfo);//此處的userinfo就代表發送通知時,傳過來的userinfo}

3.移除通知

-(void)dealloc{    //移除通知,避免消耗記憶體 ,第一個參數,代表之前註冊的通知接收對象,第二個參數,代表註冊時寫的通知名字    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"Notifi" object:nil];}

通知模式的使用

在main函數中

        Student *stu = [Student new];        //將學生對象添加為觀察者(監聽者)        [stu addNotifi];                //第一個參數:傳入通知名字,告訴通知中樞,給哪個通知發訊息,注意,此處的名字要與之前註冊的名字完全一致,第二個參數,代表發送通知時附帶的參數或資訊        NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"1",@"a", nil];//        [[NSNotificationCenter defaultCenter] postNotificationName:@"Notifi" object:dic];                //userInfo是通知的一個變數,也可以用來傳參        [[NSNotificationCenter defaultCenter]postNotificationName:@"Notifi" object:nil userInfo:dic];

 

 

kvo與通知模式的比較:

通知模式是由通知中樞發送(不可控),kvo是由kvc進行賦值(可控)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.