object—c 代理 協議 委託 資料來源 概念

來源:互聯網
上載者:User
2011-08-05 10:01

(網摘)

OBJC 中的 protocol 相當於 java 裡的介面,delagate 就是介面的實作類別(C中的回調類似 );

資料來源就是對象遵循了儲存資料的協議,可以儲存使用資料 

 

協議表示了方法可以被任何類所實現。協議本身不是類。他們只是簡單定義了一個其他對象可以實現的介面。當你的類實現了協議中的某個方法的時候也就是說你的類實現了那個協議。


Objective-C的另一個擴充稱為協議,它非常象Java中的介面。兩者都是通過一個簡單的方法聲明列表發布一個介面,任何類都可以選擇實現。協議中的方法通過其它類執行個體發送的訊息來進行調用。


iPhone程式開發裡,object-c裡的delegate怎麼理解?
答:設定代理
然後就可以實現協議了。
相當於C++裡實現一個介面,或Java裡實現一個抽象類別裡的抽象方法。
有些類裡不僅可以設定代理,還可以為其設定資料來源(比如一些模態視窗UIActionSheet之類的)。

有很多時候是需要在B類口中來完成一些對A類的操作, 這時就需要A設個代理讓B來完成了,這個在應用中很常見也很實用。

 

來源地址http://www.cocoachina.com/bbs/read.php?tid-26591.html

iphone開發重要基礎知識------委託代理(degegate)
委託代理(degegate),顧名思義,把某個對象要做的事情委託給別的對象去做。那麼別的對象就是這個對象的代理,代替它來打理要做的事。反映到程式中,
首先要明確一個對象的委託方是哪個對象,委託所做的內容是什麼。委託機制在很多語言中都用到的,這隻是個通用的思想,網上會有很多關於這方面的介紹。
  那麼在蘋果開發過程中,用到委託的程式實現思想如下,我主要拿如何在視圖之間傳輸資訊做個例子。譬如:在兩個頁面(UIIview視
圖對象)實現傳值,用委託(delegate)可以很好做到。
方法:
@interface A:UIView
id transparendValueDelegate;
@property(nomatic, retain) id transparendValueDelegate;
@end
@implemtion A
@synthesize transparendValueDelegate

-(void)Function

NSString* value = @"hello";
[transparendValueDelegate transparendValue: value];
}
@end

類B
@interface B:UIView
NSString* value;
@end
@implemtion B
-(void)transparendValue:(NSString*)fromValue
{
value = fromValue;
NSLog(@"the value is %@ ",value); 
}
@end

// 下面的設定A代理委派物件為B
//在定義A和B類對象處:
A* a = [[A alloc] init];
B* b = [[B alloc] init];
a. transparendValueDelegate = b;//設定A代理委派物件為B
這樣 在視圖A和B之間可以通過委託來傳值了。

下面這個例子委託有兩類:
1、一個視圖類對象的代理對象為父視圖,子視圖用代理
現讓父視圖顯示別的子視圖
2、同一父視圖下的一個子視圖為另一個子視圖的代理對象,讓另一個子視圖改變自身背景色為給定的顏色

代理,解決了C++中,動不動就要繼承等等,實現個協議就ok了。
比如mfc中,每一個程式都要繼承自CWinApp無非就是要重寫那幾個虛函數,不覺得麻煩嘛?
所以啊,在cocoa裡面,就實現個UIApplicationDelegate代理,不用繼承。只需要關心
你要捕獲的應用程式生命週期中的事件(函數)就可。 

代理就是一個引用指標,比方類a中有一個類b得指標,則b就是a得代理,a得代理就是b,那麼a幹完一件事情得時候告訴b,讓b調用對應得方法來做響應。。這就是代理

協議(Protocol)的用法和代碼例子

協議,是通過網路,電腦使用者進行通訊後,互相進行約定規定的集合。兩個類進行通訊,用協議就比較方便。下面是CocoaChina 版主“angellixf”為新手寫的協議入門介紹以及代碼例子,希望對剛入門開發人員有所協助
一、說明
  1.協議聲明了可以被任何類實現的方法
  2.協議不是類,它是定義了一個其他對象可以實現的介面
  3.如果在某個類中實現了協議中的某個方法,也就是這個類實現了那個協議
  4.協議經常用來實現委派物件。一個委派物件是一種用來協同或者代表其他對象的特殊對象。
  5:委託,就是調用自己定義方法,別的類來實現。
  6.新特性說明
    @optional先行編譯指令:表示可以選擇實現的方法
    @required先行編譯指令:表示必須強制實現的方法

二、定義

.h
@protocol ContactCtrlDelegate
-(void)DismissContactsCtrl;
@end

@interface ContactsCtrl : UIViewController {
    id <ContactCtrlDelegate> delegate;
}
@property (nonatomic, assign) id <ContactCtrlDelegate> delegate;

.m
@synthesize delegate;

三、例子

例如:UITextView
@protocol UITextViewDelegate <NSObject>

@optional

- (BOOL)textViewShouldBeginEditing:(UITextView *)textView;
- (BOOL)textViewShouldEndEditing:(UITextView *)textView;

- (void)textViewDidBeginEditing:(UITextView *)textView;
- (void)textViewDidEndEditing:(UITextView *)textView;

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text;
- (void)textViewDidChange:(UITextView *)textView;

- (void)textViewDidChangeSelection:(UITextView *)textView;

@end

  如果要調用以上這些方法,就必須設定UITextView的委託:TextView.delegate = self;

四、Demo

1、ContactsCtrl.h

#import <UIKit/UIKit.h>

//定義協議
@protocol ContactCtrlDelegate
-(void)DismissContactsCtrl;
@end

@interface ContactsCtrl : UIViewController {
    IBOutlet UINavigationBar *ContactNavBar;
    id <ContactCtrlDelegate> delegate;
}
@property (nonatomic, assign) id <ContactCtrlDelegate> delegate;

-(IBAction)canCelBtn:(id)sender;
@end

2、ContactsCtrl.m

@implementation ContactsCtrl
@synthesize delegate;

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    [super viewDidLoad];
    ContactNavBar.topItem.prompt = @"選取連絡人傳送簡訊";
}

//調用協議中的方法
-(IBAction)canCelBtn:(id)sender{
    [delegate DismissContactsCtrl];
}

3、ProtocolDemoCtrl.h

#import <UIKit/UIKit.h>
#import "ContactsCtrl.h"
@interface ProtocolDemoCtrl : UIViewController <ContactCtrlDelegate>{//添加委託
    ContactsCtrl *contactsView;
}

4、ProtocolDemoCtrl.m

#import "ProtocolDemoCtrl.h"
#define BARBUTTONADD(SELECTOR) [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:SELECTOR] autorelease];

@implementation ProtocolDemoCtrl
@synthesize contactsView;

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationItem.rightBarButtonItem = BARBUTTONADD(@selector(addContactAction:));
}

- (void)addContactAction:(id)sender{
    ContactsCtrl *contactView = [[ContactsCtrl alloc] initWithNibName:@"ContactsCtrl" bundle:nil];
    self.contactsView = contactView;
    contactsView.delegate = self;//設定委託
    [self presentModalViewController:contactsView animated:YES];
    [contactView release];    
}

//實現ContactCtrlDelegate協議中的方法
-(void)DismissContactsCtrl{
    [contactsView dismissModalViewControllerAnimated:YES];
}

具體看下Demo的實現哈,還有有時間可以看看Objective-c基礎教程2.0這本書。(新手注意)

採用某個協議 相當於給閱讀類聲明的編程人員發送一條訊息,表明我們啊可以用他完成兩件事情,啥呢
1、對自身編碼和解碼
2、能夠複製自身

如果你沒定義 那你第四步的func就是自己的方法 而不是協議中的了

而且協議又沒說你必須實現方法了 你也知道協議分為正式協議和非正式協議,正式的採用實現方法

聯繫我們

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