2011-03-16 5 views
19

¿cuál es la diferencia entre delegado y notificación?¿cuál es la diferencia entre delegado y notificación?

he entendido como delegado y el protocolo,

@protocol classADelegate 

-(void)DelegateMethod; 


@end 



classB <classADelegate>{ 

    classA *ObjOfclassA=[[classA alloc]init]; 

    ObjOfclassA.delegate=self; 

//while push later, here we have taken the pointer of classB(self) to classA and stored in delegate variable of classA. so from classA we can call the function in classB 

    push:classA from here. 


    -(void)DelegateMethod{ 

     nslog(@"i am rithik from India"); 


    } 

} 


classA{ 

    id <classADelegate> delegate; 

    -(void)viewdidload{ 

     [self.delegate DelegateMethod]; 

    } 

} 

Mi duda es

¿Por qué no usamos en classA como esto

classA{ 

**classB** <classADelegate> delegate; 


[self.delegate DelegateMethod]; 

} 

¿cuál es la razón para el uso " id "y cuál es la diferencia de ellos?

hemos llamado al método de la función DelegateMethod de la clase B que proviene de la definición del protocolo.

en su lugar, podemos llamar directamente a ese método definiendo ese método de instancia de classB.porque tenemos el puntero got for classB en la variable de delegado de classA.

les gusta esto.

classB{ 

-(void)DelegateMethod; 

} 

y luego llamar a esto en

classA{ 

     classB delegate; 

     -(void)viewdidload{ 

      [self.delegate DelegateMethod]; 

     } 

    } 

así de lo anterior hemos evitado la variable de protocolo y el ID de.

pero sabía que muchos de nosotros usamos delegados y protocolo. aquí llegué a saber acerca de cualquier ventaja mientras uso delegado y protocolo

aquí cuál es el uso de la implementación del protocolo para el método de la función DelegateMethod.

en su lugar, definición de instancia.

¿cuál es el uso de los de @protocol.

favor me guía cualquiera dirección correcta ...

Soy nuevo en Desarrollos iPhone.

ahora que sabía cómo crear delegado .pero mientras que vine a estudiar sobre el NSNotification

que también se haga el trabajo casi justo como delegado.

así que cuando debería usar el delgate o NSnotification.

thanku

+0

gracias por editar 7KV7 – rithik

Respuesta

98

respuesta corta: que se pueda imaginar delegados como una llamada telefónica. Llamas a tu amigo y específicamente quieres hablar con ellos. Puedes decir algo y ellos pueden responder. Puedes hablar hasta que cuelgues el teléfono. Los delegados, de la misma manera, crean un enlace entre dos objetos, y no necesita saber qué tipo será el delegado, simplemente tiene que implementar el protocolo. Por otro lado, NSNotifications son como una estación de radio. Transmiten su mensaje a quien esté dispuesto a escuchar. La estación de radio no puede recibir comentarios de sus oyentes (a menos que tenga un teléfono o un delegado). Los oyentes pueden ignorar el mensaje o pueden hacer algo con él. NSNotifications le permite enviar un mensaje a cualquier objeto, pero no tendrá un enlace entre ellos para comunicarse de ida y vuelta. Si necesita esta comunicación, probablemente debería implementar un delegado. De lo contrario, NSNotifications es más simple y fácil de usar, pero puede meterlo en problemas.

respuesta larga:

Los delegados son por lo general una forma más adecuada de manejar las cosas, sobre todo si va a crear un marco para uso de otros. Usted gana tiempo de compilación comprobando los métodos necesarios cuando usa protocolos con sus delegados, para que sepa cuándo compila si le faltan los métodos requeridos. Con NSNotificationCenter no tiene esa garantía.

NSNotificationCenter es tipo de "cortar-ish" y se utiliza con frecuencia los programadores noveles, que puede llevar a la mala arquitectura. Muchas veces estas dos características son intercambiables, pero los desarrolladores más "hardcore" pueden burlarse del uso de NSNotificationCenter.


Q:¿cuál es la razón para usar "id" y cuál es la diferencia entre ellos?

A: Usando id le permite enviar cualquier objeto con el método como un parámetro. Tenga en cuenta que no puede enviar primitivas como bools, floats, doubles, ints, etc. a menos que estén envueltas en sus respectivas envolturas de Object.


classB{ 

-(void)DelegateMethod; 

} 

y luego llamar a esto en

classA{ 

    classB delegate; 

    -(void)viewdidload{ 

     [self.delegate DelegateMethod]; 

    } 

} 

El ejemplo anterior que ya ha proporcionado requeriría que el delegado classA 's siempre ser de tipo classB, que no es ventajosa. En lugar de utilizar delegados en este escenario, probablemente solo use una variable que se refiera a su otra clase, por ejemplo, myClassB. La belleza de los delegados es que se puede pasar por cualquier objeto, y el código solo funciona siempre que implementen los métodos necesarios (que el compilador garantiza, siempre que estén marcados como el tipo de delegado correcto).

+0

hey freeasinbeer thanku. – rithik

+11

Estoy completamente en desacuerdo con que las notificaciones sean "hack-ish", al menos por naturaleza. La delegación es ideal para objetos que están estrechamente relacionados o relacionados, y es ideal para la comunicación de uno a uno. Las notificaciones son para relaciones más relajadas o comunicación de uno a muchos. * Se pueden * usar * de forma "hack-ish", pero también pueden hacerlo los delegados. –

+0

hey frederick el código anterior sin el uso del protocolo y la identificación es correcto o incorrecto. ¿Por qué tenemos que poner la variable de identificación en eso ... explique por favor ronaldo – rithik

12

Un delegado utiliza protocolos y crea una relación has-a entre las dos clases. Uno de los otros beneficios de los delegados es que puede devolver algo a la clase propietaria.

Las notificaciones, por otro lado, están más orientadas a la comunicación punto a multipunto.Un ejemplo del uso de un NSNotification podría estar en una aplicación de controlador de barra de pestañas, donde es posible que deba notificar a varios controladores de vista de un evento en particular para que puedan actualizar los datos, etc. Esto es ideal para las clases que no tienen conocimiento el uno del otro y no tendría sentido si lo hicieran.

Ahora, a sus otras preguntas:

¿Por qué usamos id?
En su clase, desea un identificador para un objeto de tipo indeterminado tipo, pero que implementa el protocolo que defina. Tome UIWebView, por ejemplo. Puede haber tipos infinitesimales de clases que pueden ser delegados para él, por lo tanto, no debe nombrar un tipo específico de clase, sino especificar que la clase debe implementar el protocolo UIWebViewDelegate. Esto reduce el acoplamiento a un mínimo absoluto y crea una aplicación altamente cohesionada en la que está creando interacción basada en el comportamiento , no en estado.

Por lo tanto, vamos a ejecutar a través de un ejemplo:

@protocol ClassADelegate 
- (NSString*) determineValue; 
@end 

@interface ClassA : NSObject 
{ 
    id<ClassADelegate> delegate; 
} 
// Make sure you are using assign, not retain or copy 
@property (nonatomic, assign) id<ClassADelegate> delegate; 

@end 

La implementación de ClassA:

import "ClassA.h" 

@implementation ClassA 
@synthesize delegate; 

- (void) somePrivateMethod 
{ 
    if (self.delegate && [self.delegate implementsProtocol:@protocol(ClassADelegate)]) 
    { 
     NSString* value = [self.delegate determineValue]; 

     // Do other work 
    } 
} 

- (void) dealloc 
{ 
    delegate = nil; 
} 

@end 

En la cabecera, declaramos que la clase implementará el ClassADelegate protocolo:

#import "ClassA.h" 

@interface ClassB : NSObject <ClassADelegate> 
{ 
} 

- (void) someMethod; 

@end 

En la implementación de ClassB creamos una instancia de ClassA y establecer B como el delegado de A:

#import "ClassB.h" 
@implementation ClassB 

- (void) someMethod 
{ 
    ClassA* aClass = [[ClassA alloc] init]; 

    aClass.delegate = self; 

    // Other work and memory clean up of A. 
    // Some logic occurs in A where it calls the delegate (self) which will 
    // call the `determineValue` method of this class. 
} 

// Here's the delegate method we implement 
- (NSString*) determineValue 
{ 
    return @"I did some work!"; 
} 

@end 
+0

así que tenemos que usar delegar al objeto conocido especificado.notificación de todos los objetos. Es correcto – rithik

+0

Muchas gracias amigo, pero y tenemos que especificar en @property con asignar hay alguna especial para esto . – rithik

+0

@rithik Sí. Los delegados crean relaciones entre clases. Las notificaciones se utilizan para enviar eventos a una o más clases. –

0

Podemos utilizar las notificaciones por una variedad de razones. Por ejemplo,, podría transmitir una notificación para cambiar la forma en que los elementos de la interfaz de usuario muestran información basada en un determinado evento en otro lugar del programa. O bien, podría utilizar las notificaciones como una forma de garantizar que los objetos en un documento guarden su estado antes de que se cierre la ventana del documento.

El propósito general de las notificaciones es informar a otros objetos de los eventos del programa para que puedan responder adecuadamente. Pero los objetos que reciben notificaciones pueden reaccionar solo después de que se haya producido el evento. Esta es una diferencia significativa de la delegación.

El delegado tiene la posibilidad de rechazar o modificar la operación propuesta por el objeto delegante. Observar objetos, por otro lado, no puede afectar directamente una operación inminente.

3

El delegado está pasando el mensaje de un objeto a otro. Es como comunicación uno a uno, mientras que nsnotification es como pasar mensajes a múltiples objetos al mismo tiempo. Todos los demás objetos que se han suscrito a esa notificación o los observadores actuantes de esa notificación pueden o no responder a ese evento. Las notificaciones son más fáciles, pero puede meterse en problemas al usar aquellas como mala arquitectura. Los delegados se usan con más frecuencia y se usan con la ayuda de protocolos.

+0

Agradable explicación – Prakash

0

Simplemente Podemos decir,

Delegados:

uno - a - uno

Notificación:

uno - a - muchos

Declarar Delegado

@protocol DelegateName 
@required 
- (void)method:(NSString *)param; 
@optional 
- (void)methodOptional:(NSString *)param; 
@end 

y declarar una propiedad de Protocolo

@property id <DelegateName> delegate; 

Puede utilizar

myObject.delegate = <# some object conforming to DelegateName #>; 

NSNotification declaración

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(notificationHappened:) 
              name:MyCustomNotificationName 
              object:nil]; 

luego implementar

- (void)notificationHappened:(NSNotification *)notification { 
    // do work here 
} 

Puede publicar Notificación de usar en cualquier lugar,

[[NSNotificationCenter defaultCenter] postNotificationName:MyCustomNotificationName 
                object:self 
                userInfo:nil]; 

llamada removeObserver: cuando haya terminado.

Cuestiones relacionadas