2009-06-25 18 views
49
  1. Qualcuno sa dove posso trovare una buona spiegazione/tutorial su cosa e come funziona un'applicazione delegata in objective-C?
  2. I due libri che ho non si soffermano abbastanza su delegates e non li spiegano molto bene perché io comprenda veramente il loro potere e la loro funzione.
+0

Si scrive "delegato applicazione" ma credo che questa domanda non è specificamente delegato dell'oggetto NSApplication condivisa di un'applicazione Cocoa? –

risposta

77

In caso di dubbio, controllare lo docs!

In sostanza, la delega è un modo per consentire agli oggetti di interagire tra loro senza creare forti interdipendenze tra di loro, poiché ciò rende meno flessibile la progettazione dell'applicazione. Invece degli oggetti che si controllano a vicenda, possono avere un delegato a cui inviano (o delegano) messaggi, e il delegato fa qualunque cosa facciano, per rispondere e agire a questo messaggio, e quindi di solito restituisce qualcosa all'altro oggetto .

La delega è anche un'alternativa migliore alla sottoclasse. Invece di dover creare classi personalizzate per modificare leggermente il modo in cui gli altri oggetti si comportano o passarli, la delega consente agli oggetti di inviare messaggi ai loro delegati per lavorare per loro senza il sovraccarico di creare sottoclassi per apportare modifiche minori a altri oggetti.

Naturalmente, lo svantaggio principale della delega è che i metodi delegati disponibili dipendono da ciò che gli ingegneri Apple ritengono utile e da quali implementazioni comuni si aspettano che le persone abbiano bisogno, il che impone una limitazione su ciò che è possibile ottenere. Sebbene, come ha sottolineato Quinn Taylor, questo è specifico per i framework Cocoa e quindi non si applica a tutte le situazioni.

Se la delega è una facoltà di sottoclassi, poi prendere, perché è un modo molto più pulito per gestire il codice e le interazioni tra gli oggetti.

+0

Grazie ... Non riuscivo a trovare nulla sui delegati nelle pagine man in precedenza quando stavo cercando. Indovina che ero nella sezione sbagliata. –

+0

È improbabile trovare qualcosa su Objective-C nelle pagine man. I documenti online di Apple sono la fonte definitiva, non solo per le specifiche del cacao, ma anche per lo sfondo concettuale. –

+0

@Quinn Taylor: Sì, l'ho cambiato. Stavo parlando nel contesto anche se sì, quando si parla in generale di delega non si applica. –

12

I delegati sono uno schema di progettazione; non c'è una sintassi speciale o supporto linguistico.

Un delegato è solo un oggetto che un altro oggetto invia messaggi a quando certe cose accadono, in modo che il delegato in grado di gestire informazioni specifiche app l'oggetto originale non è stato progettato per. È un modo di personalizzare il comportamento senza sottoclassi.

20

Come descritto sopra, un delegato non è una caratteristica di IOS o Objective-C, ma solo una tecnica di programmazione e non richiede alcun supporto linguaggio specifico.

Una classe (e, g, classA) può essere scritta in modo tale che i suoi metodi getData e doSomething non possono essere implementati da sé, ma da un delegato (forse perché classA non sa cosa i dati saranno essere o cosa dovrà fare).

Per raggiungere questo obiettivo, classA fornisce una proprietà, di solito chiamato delegato, (che è solo un puntatore alla classe - il delegato - che implementa i metodi delegati) e poi, quando si vuole chiamare quei metodi, in realtà invita i metodi nella delegato:

[self.delegate getData]; 

e

[self.delegate doSomething]; 

self.delegate possono essere inizialmente impostato self:

self.delegate = self; 

Ad esempio, classA implementa la propria versione di questi metodi, a meno che non siano delegati.

Qualsiasi altra classe, che vuole essere l'implementatore dei metodi (ovvero essere il delegato ed eventualmente sostituire l'implementazione predefinita di classA), imposterà innanzitutto il delegato di classA come se stesso. quindi se ClassB voluto essere il delegato per questi metodi, in ClassB, avremmo:

classA.delegate = self; 

Così, quando classA chiama questi metodi delegati, in realtà chiama ClassB per implementare questi metodi, senza sapere nulla di ClassB o addirittura che esiste e classB non deve sottoclasse classA.

La limitazione è che la classe B può solo sovrascrivere i metodi che classA vuole delegare: con la sottoclasse, è possibile sovrascrivere qualsiasi metodo.

protocolli vengono utilizzati per formalizzare il processo di delega per la definizione di un elenco dei metodi che o deve essere attuato dal delegato (delegante non fornisce alcuna versione di default del metodo e il metodo deve essere implementato da qualche parte) o può essere opzionalmente implementato dal delegato (ovvero il delegante ha la propria versione o non importa se il metodo non è implementato).

+0

Il mio male - risorge un vecchio thread. –

+2

Questa è una spiegazione davvero meravigliosa. Ho sempre avuto problemi a capire la parte 'classA.delegate = self' fino ad ora. Grazie. – daspianist

+1

Prego. Anch'io ero confuso e avrei semplicemente scritto il codice che l'ha fatto funzionare senza capire il perché. Poi all'improvviso qualcuno lo ha spiegato in modo che clicchi, tu capisca veramente come funziona e all'improvviso sembra semplice. –

3

cerco di elaborare attraverso semplice programma

due Categorie

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; 
} 

SPIEGAZIONE :::

  1. Dal metodo principale quando initWithStudent: studente eseguirà

    1,1 insegnante di la proprietà dell'oggetto "studente" sarà a firmato con oggetto studente.

    1.2 self.student.delegate = auto significa delegato dell'oggetto studente punta a oggetto insegnante

  2. Dal metodo principale quando [studente studentInfo] sarà chiamato

    2.1 [respondToSelector self.delegate: @ selector (teacherName)] Qui delegare già punti all'oggetto insegnante in modo che possa invocare il metodo di istanza 'teacherName'.

    2.2 così [auto.delegate performSelector: @selector (teacherName)] verrà eseguito facilmente.

Sembra che l'oggetto insegnante assegni delegato all'oggetto studente per chiamare il proprio metodo.

È un'idea relativa, in cui vediamo che l'oggetto studente chiamato metodo "teacherName", ma è fondamentalmente svolto dall'oggetto insegnante stesso.

+0

Student.m e Teacher.h sono identici. Qualche possibilità di inserire il codice giusto? Sto cercando di capire come utilizzare una classe di delegati personalizzata e non riesco a trovare alcun utile esempio. Your's è il migliore che abbia mai visto finora. – CamHart

+0

@CamHart ringrazia per aver informato il mio errore. Si prega di commentare lì se qualsiasi ulteriore problema si pone in merito a "delegato". –

0

Immagina solo che chiami per telefono e ordini una pizza. Poi, un fattorino della pizza arriva a casa tua (questo è un Delegato), e quando lo si paga per la pizza, il fattorino consegna i soldi al suo ristorante.

si = oggetto la consegna ragazzo = Delegato ristorante = oggetto