2009-06-25 62 views
49
  1. 有誰知道在哪裏可以找到的東西,以及如何應用在代表工作objective-C一個很好的解釋/教程?
  2. 我對這兩本書沒有詳述delegates,並沒有很好地解釋它們讓我真正理解它們的力量和功能。
+0

你寫的「應用程序代理」,但我想這個問題是沒有專門關於Cocoa應用程序的共享的NSApplication對象的委託? – 2010-02-19 07:51:47

回答

77

如有疑問,請檢查docs

基本上,代表團允許對象,而無需創建它們之間的相互依存關係強相互交流的一種方式,因爲這使你的應用程序的設計不夠靈活。他們可以擁有一個委託人,他們可以發送(或委託)消息給委託人,委託人可以做任何他們所做的事情,以便對此消息作出響應並採取行動,然後通常將某些事物返回給另一個對象。

委託也是子類化的更好選擇。代替您必須創建自己的自定義類以稍微改變其他對象的行爲方式或將它們傳遞給數據,代理允許對象將消息發送給其代理以便爲其工作,而無需創建子類對此進行微小更改其他物體。

當然,委託的主要缺點是可用的委託方法依賴於Apple工程師預見的有用功能以及他們期望人們需要的常見實現方式,這會對您的實現產生限制。儘管Quinn Taylor指出,這是Cocoa框架特有的,因此並不適用於所有情況。

如果代表團在子類的選項,然後把它,因爲它來管理你的代碼和對象之間的交互更清潔的方式。

+0

謝謝......當我在尋找時,我無法在man page中找到有關代表的任何內容。猜猜我錯了。 – 2009-06-25 20:40:25

+0

你不可能在手冊頁中找到關於Objective-C的任何信息。蘋果的在線文檔是絕對的來源,不僅適用於可可的細節,而且適用於概念背景。 – 2009-06-25 21:46:23

+0

@奎因泰勒:是的,改變了。我在談論情況,雖然是的,但在談到代表團通常不適用時。 – 2009-06-26 05:14:43

12

代表是一種設計模式;沒有特殊的語法或語言支持。

委託是隻是另一個對象發送消息給當某些事情發生,使代表能夠處理應用程序特定的細節原來的對象沒有被設計爲一個對象。這是一種無需子類自定義行爲的方式。

20

如上所述,委託不是iOS或目標C的特徵,但只是一種編程技術,並且不需要特定的語言支持。

類(E,G,CLASSA)可以寫成這樣,它的的getDataDoSomething的方法不能由自身實現,而是通過委託(也許是因爲CLASSA不知道什麼數據將是或將要做什麼)。爲了達到這個目的,classA提供了一個屬性,通常被稱爲委託代理(它只是一個指向類的指針 - 實現委託方法的委託),然後,當它想調用這些方法時,它實際上調用的委託方法:

[self.delegate getData]; 

[self.delegate doSomething]; 

self.delegate可最初設定爲self

self.delegate = self; 

即classA實現它自己的這些方法的版本,除非它們被委託。

想要成爲方法的實現者(即成爲委託並可能覆蓋classA的默認實現)的任何其他類都會首先將classA的委託設置爲自己。因此,如果CLASSB想成爲這些方法的委託,在CLASSB,我們將有:

classA.delegate = self; 

所以當CLASSA調用這些委託的方法,它實際上是調用CLASSB實現這些方法,無需瞭解CLASSB甚至任何東西它存在並且classB不必爲classA子類。

限制是classB只能覆蓋classA想要委派的方法 - 通過子類化,你可以覆蓋任何方法。

協議用於通過限定的其中任一必須由委託執行的方法的列表,正式委派過程(委託人提供的方法的無缺省版本和方法必須某處實現),或可可以由委託人實施(即委託人擁有自己的版本,或者如果該方法未實現,則無關緊要)。

3

我試圖通過簡單的程序

兩類

來闡述它Student.h

#import <Foundation/Foundation.h> 

@interface Student : NSObject 
@property (weak) id delegate; 
- (void) studentInfo; 
@end 

Student.m

#import "Student.h" 
@implementation Student 
- (void) studentInfo 
{ 
    NSString *teacherName; 
    if ([self.delegate respondsToSelector:@selector(teacherName)]) { 
     teacherName = [self.delegate performSelector:@selector(teacherName)]; 
    } 
    NSLog(@"\n Student name is XYZ\n Teacher name is %@",teacherName); 
} 
@end 

Teacher.h

#import <Foundation/Foundation.h> 
#import "Student.h> 

@interface Teacher: NSObject 
@property (strong,nonatomic) Student *student; 
- (NSString *) teacherName; 
- (id) initWithStudent:(Student *)student; 
@end 

Teacher.m

#import "Teacher.h" 

@implementation Teacher 

- (NSString *) teacherName 
{ 
    return @"ABC"; 
} 
- (id) initWithStudent:(Student *)student 
{ 
    self = [ super init]; 
    if (self) { 
     self.student = student; 
     self.student.delegate = self; 
    } 
    return self; 
} 
@end 

的main.m

#import <Foundation/Foundation.h> 
#import "Teacher.h" 
int main (int argc, const char* argv[]) 
{ 
    @autoreleasepool { 

     Student *student = [[Student alloc] init]; 
     Teacher *teacher = [[Teacher alloc] initWithStudent:student]; 

     [student studentInfo]; 

    } 
    return 0; 
} 

說明:::

  1. 從主要方法時initWithStudent:學生將執行

    1.1教師對象的屬性'學生'將是一個與學生對象簽署。

    1.2 self.student.delegate =自 意味着學生對象的代表將指向老師對象

  2. 從主要方法時[學生studentInfo]將被稱爲

    2.1 [self.delegate respondToSelector:@選擇器(teacherName)]這裏已經將 指向教師對象,因此它可以調用'teacherName'實例方法。

    2.2 so [self.delegate performSelector:@selector(teacherName)] 將很容易執行。

它看起來像老師對象分配代表學生對象調用它自己的方法。

這是一個相對的想法,我們看到學生對象叫'teacherName'方法,但它基本上是由老師對象本身完成的。

0

試想一下,你通過電話打電話,並訂購比薩餅。 然後,一個披薩送貨員到達您的家(這是一位代表),當您付錢給比薩餅時,送貨比薩餅男孩將錢還給他的餐廳。

你=對象送外賣=委託餐廳=對象