objective-c 協議與委託

來源:互聯網
上載者:User

委託(delegate)是一種對象,另一個類的對象會要求委派物件執行它的某些操作。
建立一個“NSObject”類別稱為建立一個非正式協議
任何實現“NSObject”類別中的方法的類的對象都可以成為委派物件。因為在Objective-C中所有的
類都是NSObject的子類。
當你想要向委派物件發送訊息時,最好先檢查該對象是否理解你將要發送的訊息。
if ([delegate respondsToSelector: @selector(...)]
{
  [delegate ...];
}
正式協議:通過在@protocol部分列出一組方法名來定義一個正式協議。通過在@interface聲明中的類名之後列出
用角括弧括起來的協議名稱,對象可以採用協議。當對象採用一個協議時,它承諾實現該協議中列出的每一個要求
實現的方法。如果你沒有實現,編譯器會提出警告,從而協助你履行承諾。
當你使用了某個協議時,最好顯示的聲明,而不僅僅是實現了協議的方法(雖然可以這麼做)。
下面這個例子中,沒有聲明採用協議FooDelegate,而只是實現了協議方法-(void)fun。這樣雖然也能工作,
但這不是一個好的編程習慣。(應把Temp的聲明改為@interface Temp:NSObject<FooDelegate>)
應該始終在類聲明時指明我們使用的協議,這能明確表達我們的意圖。這也是為什麼要有正式協議的原因,否則
非正式協議就滿足了。

/**********************************************                                         Foo.h***********************************************/#import <Foundation/Foundation.h>@interface Foo : NSObject{        NSInteger _t;}@property NSInteger t;@property (nonatomic, strong) id delegate;-(void) notify;@end@protocol FooDelegate-(void)fun;@end/**********************************************                                         Foo.m***********************************************/#import "Foo.h"@implementation Foo@synthesize delegate;-(void)setT:(NSInteger)newt{        self.t = newt;}-(NSInteger)t{    NSLog(@"getter");    return self.t;}-(void) notify{    NSLog(@"notify...");    if ([delegate respondsToSelector:@selector(fun)])    {        [delegate fun];    }}@end/**********************************************                                         Temp.h***********************************************/#import <Foundation/Foundation.h>@interface Temp : NSObject@end/**********************************************                                         Temp.m***********************************************/#import "Temp.h"@implementation Temp-(void) fun{    NSLog(@"Temp fun");}@end/**********************************************                                         main.m***********************************************/#import <Foundation/Foundation.h>#import "Foo.h"#import "Temp.h"int main (int argc, const char * argv[]){    @autoreleasepool {                        Foo *ob = [[Foo alloc] init];        Temp *t = [[Temp alloc] init];        ob.delegate = t;        [ob notify];            }       return 0;}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.