Solución:
Un protocolo, declarado con el (@protocol
sintaxis en Objective-C) se usa para declarar un conjunto de métodos que una clase “adopta” (declara que usará este protocolo) implementará. Esto significa que puede especificar en su código que “no le importa qué clase se use siempre que implemente un protocolo en particular”. Esto se puede hacer en Objective-C de la siguiente manera:
id<MyProtocol> instanceOfClassThatImplementsMyProtocol;
Si indica esto en su código, entonces cualquier clase que “se ajuste” al protocolo MiProtocolo se puede utilizar en la variable instanceOfClassThatImplementsMyProtocol. Esto significa que el código que usa esta variable sabe que puede usar cualquier método definido en MiProtocolo con esta variable en particular, independientemente de la clase que sea. Esta es una excelente manera de evitar el patrón de diseño de herencia y evita un acoplamiento estrecho.
Los delegados son un uso de la característica de lenguaje de los protocolos. El patrón de diseño de delegación es una forma de diseñar su código para usar protocolos cuando sea necesario. En los marcos de Cocoa, el patrón de diseño delegado se usa para especificar una instancia de una clase que se ajusta a un protocolo en particular. Este protocolo en particular especifica métodos que la clase delegada debe implementar para realizar acciones específicas en eventos dados. La clase que usa el delegado sabe que su delegado está integrado en el protocolo, por lo que sabe que puede llamar a los métodos implementados en momentos determinados. Este patrón de diseño es una excelente manera de desacoplar las clases, porque hace que sea realmente fácil intercambiar una instancia de delegado por otra; todo lo que el programador tiene que hacer es asegurarse de que la instancia o clase de reemplazo cumpla con el protocolo necesario (es decir, implementa el métodos especificados en el protocolo)!
Los protocolos y delegados no están restringidos solo al desarrollo de Objective-C y Mac / iOS, sino que el lenguaje Objective-C y los marcos de Apple hacen un uso intensivo de esta característica de lenguaje y patrón de diseño asombrosos.
Editar:
He aquí un ejemplo. En el marco UIKit de Cocoa Touch, hay un UITextFieldDelegate protocolo. Este protocolo define una serie de métodos que las clases que son delegadas de un UITextField instancia debe implementar. En otras palabras, si desea asignar un delegado a un UITextField (utilizando el delegate
propiedad), será mejor que se asegure de que esta clase se ajuste a UITextFieldDelegate. De hecho, debido a que la propiedad delegada de UITextField Se define como:
@property(nonatomic, weak) id<UITextFieldDelegate> delegate
Luego, el compilador dará advertencias si le asigna una clase que no implementa el protocolo. Esto es realmente útil. Tienes que decir que una clase implementa un protocolo, y al decir que lo hace, estás dejando que otras clases sepan que pueden interactuar de una manera particular con tu clase. Entonces, si asigna una instancia de MyTextFieldDelegateClass al delegate
propiedad de UITextField, los UITextField sabe que puede llamar a algunos métodos particulares (relacionados con la entrada de texto, selección, etc.) de su MyTextFieldDelegateClass. Lo sabe porque MyTextFieldDelegateClass ha dicho que implementará la UITextFieldDelegate protocolo.
En última instancia, todo esto conduce a una flexibilidad y adaptabilidad mucho mayores en el código de su proyecto, lo cual estoy seguro de que pronto se dará cuenta después de usar esta tecnología. 🙂
El protocolo es un conjunto de métodos (ya sean opcionales o obligatorios) que serían implementados por la clase que se ajusta a ese protocolo. Mientras que, delegado es la referencia a esa clase que se ajusta a ese protocolo y se adherirá a los métodos de implementación definidos en el protocolo.
Eche un vistazo a este documento de Apple para obtener más detalles.
Delegación: actuar en nombre de otro objeto (patrón de diseño en Ups)
Es un patrón de diseño en el que un objeto llamado delegado actúa en nombre y a pedido de otro objeto; en algún momento de la ejecución, envía un mensaje a su delegado; el mensaje le dice al delegado que algún evento está a punto de suceder y pide una respuesta El delegado implementa el método invocado por el mensaje y devuelve un valor apropiado
Un ejemplo es el objeto appdelegate actúa en nombre de appobject.
Protocolo: Habilitación de la comunicación entre objetos no relacionados por herencia
Un protocolo es una declaración de una interfaz programática cuyos métodos cualquier clase puede implementar. Los protocolos son objetivos c característica de idiomaSimplemente hablando, una lista de métodos que cualquier clase puede implementar. Para usar esto, debe confirmar el protocolo. Un ejemplo es el protocolo UITableviewDatasource, cuyos métodos cellforRowAtIndexPath se declaran en el protocolo, pero lo implementamos para crear la vista de tabla.
Consulte https://developer.apple.com/library/mac/referencelibrary/GettingStarted/RoadMapOSX/books/StreamlineYourAppswithDesignPatterns/StreamlineYourApps/StreamlineYourApps.html