關於delegate 與 protocol 的理解 iOS


delegate  protocol 是objective-c 語法的一部分 但他們兩個卻完全不是一回事。主要是我們經常在同一個文件里見到這兩個東西

protocol(協議)我的理解就是定義這么一個東西。以后就按這里的規定來辦事。

delegate(委托)  就是把事情委托給別人去辦 

@required 就是必須去辦的。比如UITableView  delegate里面的:

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

這個就是必須要實現的方法

@optional則是可做或不做。比如TUIableView  delegate 里面的:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

這個就是可要可不要

 

關於delegate  protocol 網上有一個例子講的非常形象:

           我上班的工作主要內容包括 (1)寫代碼(2)寫文檔(3)測試程序(4)接電話(5)會見客戶

(1)(2)我自己全權負責,但是后面(3)(4)(5)我不想或者不方便自己做,所以我想找個助手(delegate)幫我做這些事,於是我定了一個招聘要求(Protocol),里寫明我的助手需要會做(3)(4)(5)這三件事。很快,我招到一個助手。

        即:我.delegate = 助手;

於是以后每當我遇到需要測試程序或者接電話的活,我就把他轉交給助手(delegate)去處理,助手處理完后如果有處理結果(返回值)助手會告訴我,也許我會拿來用。如果不需要或者沒有結果,我就接着做下面的事。。

下面實現一個簡單的protocol 

在DelegateTest.h里實現protocol 

//定義protocol 協議
#import <UIKit/UIKit.h>

@protocol DelegateTestDelegate;
@interface DelegateTest : NSObject
{
    id<DelegateTestDelegate> delegate;
}
@property(nonatomic,assign)id<DelegateTestDelegate> delegate;
@property(nonatomic,assign)NSInteger nb;
-(void)printPublic;         //公開
@end

//協議里的方法
@protocol DelegateTestDelegate<NSObject>

-(void)print:(NSInteger)number;        //如果別的類也用到了這個protocol 那么就可以直接調用了。
-(void)print;
@end

DelegateTest.m 文件

#import "DelegateTest.h"

@interface DelegateTest ()

@end

@implementation DelegateTest
@synthesize delegate;
@synthesize nb;

//如果這個類是基於UIControllView的話。可以直接在ViewDidLoad里面調用。那么效果也是一樣的  這里就相當於別的類里調用這個方法。起到激活的作用
-(void)printPublic
{
    [delegate print];
    [delegate print:nb];
}


@end

 

ViewController.h 文件

#import <UIKit/UIKit.h>
#import "DelegateTest.h"
@interface ViewController : UIViewController<DelegateTestDelegate>  //這里的DelegateTestDelegate也就相當於UITableView里的UITableViewDelegate
{
    DelegateTest *delegateTest;
}

@property (nonatomic, assign)DelegateTest *delegateTest;
@end

ViewController.m 文件

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController
@synthesize delegateTest;

- (void)viewDidLoad
{
    [super viewDidLoad];
    delegateTest = [[DelegateTest alloc]init];
    [delegateTest setDelegate:self];  //設置代理
    [delegateTest printPublic ];  //選擇調用delegateTest 里的這個方法。然后就可以調用下面的print了。也就相當於把print給激活了
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}

//調用DelegateTest  protocol 里面的方法
-(void)print
{
    NSLog(@"qingjoin print succeed");
}
-(void)print:(NSInteger)number
{
    NSLog(@"%d",number);
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

@end

 

當調試運行到ViewController.m文件里的ViewDidLoad 時。就會自動調用 print 

輸出:

2012-11-22 14:09:48.629 DelegateDemo[1875:f803] qingjoin print succeed

2012-11-22 14:09:48.630 DelegateDemo[1875:f803] 0

 

我的理解還很淺顯。如果有錯誤請指正。

 

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM