ios objective-c delegates

ios - ¿Cómo funciona un delegado en el objetivo C?



objective-c delegates (5)

  1. ¿Alguien sabe dónde puedo encontrar una buena explicación / tutorial de qué y cómo funciona un delegado de la aplicación en el objective-C ?
  2. Los dos libros que tengo no se refieren a los delegates suficiente y no los explico muy bien para que pueda comprender realmente su poder y función.

Como se describió anteriormente, un delegado no es una función de iOS o Objective-C, sino simplemente una técnica de programación y no requiere soporte de lenguaje específico.

Se puede escribir una clase (e, g, clase A) de modo que sus métodos getData y doSomething puedan implementarse no por sí mismo, sino por un delegado (quizás porque la clase A no sabe qué datos serán o qué tendrá que hacer )

Para lograr esto, classA proporciona una propiedad, generalmente llamada delegate , (que es solo un puntero a la clase - el delegado - que implementa los métodos delegados) y luego, cuando quiere llamar a esos métodos, realmente llama a los métodos en el delegar:

[self.delegate getData];

y

[self.delegate doSomething];

self.delegate puede establecerse inicialmente a self :

self.delegate = self;

es decir, classA implementa su propia versión de estos métodos, a menos que sean delegados.

Cualquier otra clase, que quiera ser el implementador de los métodos (es decir, para ser el delegado y posiblemente anule la implementación predeterminada de la clase A), primero establecerá que el delegado de la clase A sea él mismo. entonces si classB quisiera ser el delegado para estos métodos, en el classB, tendríamos:

classA.delegate = self;

Entonces cuando classA llama a estos métodos delegados, en realidad está llamando a classB para implementar estos métodos, sin saber nada sobre classB o incluso si existe y classB no tiene que subclasificar classA.

La limitación es que classB solo puede anular los métodos que claseA desea delegar: con la creación de subclases, puede anular cualquier método.

Los protocolos se usan para formalizar el proceso de delegación al definir una lista de métodos que el delegado debe implementar (el delegador no proporciona una versión predeterminada del método y el método debe implementarse en algún lugar) o el delegado puede implementarlo opcionalmente (es decir, el delegador tiene su propia versión o no importa si el método no se implementa).


En caso de duda, ¡revisa los docs !

Básicamente, la delegación es una forma de permitir que los objetos interactúen entre sí sin crear fuertes interdependencias entre ellos, ya que esto hace que el diseño de su aplicación sea menos flexible. En lugar de que los objetos se controlen mutuamente, pueden tener un delegado al que envían (o delegan) mensajes, y el delegado hace lo que hace para responder y actuar de acuerdo con este mensaje, y luego generalmente devuelve algo al otro objeto .

La delegación también es una mejor alternativa a la subclasificación. En lugar de tener que crear sus propias clases personalizadas para modificar ligeramente la forma en que se comportan otros objetos o pasarles datos, la delegación permite a los objetos enviar mensajes a sus delegados para que trabajen para ellos sin la sobrecarga de crear subclases para realizar cambios menores en otros objetos

Por supuesto, la principal desventaja de la delegación es que los métodos delegados disponibles dependen de lo que los ingenieros de Apple prevén como útiles y qué implementaciones comunes esperan que las personas necesiten, lo que impone una restricción sobre lo que puede lograr. Aunque, como señaló Quinn Taylor, esto es específico de los marcos de trabajo de Cocoa, por lo que no se aplica en todas las situaciones.

Si la delegación es una opción sobre las subclases, tómalo, porque es una manera mucho más limpia de administrar tu código y las interacciones entre los objetos.


Intento elaborarlo a través de un programa simple

Dos clases

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

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

EXPLICACIÓN :::

  1. Desde el método principal cuando initWithStudent: student se ejecutará

    1.1 La propiedad del objeto del maestro ''estudiante'' se asignará con el objeto del estudiante.

    1.2 self.student.delegate = self significa que el delegado del objeto estudiante señalará el objeto del profesor

  2. Desde el método principal cuando se llamará [student studentInfo]

    2.1 [self.delegate respondToSelector: @selector (teacherName)] Aquí el delegado ya apunta al objeto del profesor para que pueda invocar el método de instancia ''teacherName''.

    2.2 entonces [self.delegate performSelector: @selector (teacherName)] se ejecutará fácilmente.

Parece que el objeto Maestro asigna un delegado al objeto del alumno para llamarlo a su propio método.

Es una idea relativa, donde vemos ese objeto de estudiante llamado método ''teacherName'', pero básicamente lo hace el propio objeto de profesor.


Los delegados son un patrón de diseño; no hay sintaxis especial o soporte de idioma.

Un delegado es simplemente un objeto al que otro objeto envía mensajes cuando suceden ciertas cosas, para que el delegado pueda manejar detalles específicos de la aplicación para los que el objeto original no fue diseñado. Es una forma de personalizar el comportamiento sin crear subclases.


Solo imagine que llama por teléfono y pida una pizza. Luego, un repartidor de pizzas llega a su casa (este es un Delegado), y cuando paga la pizza, el repartidor de pizzas entrega el dinero a su restaurante.

you = object delivery boy = delegar restaurante = objeto