Как делегат работает в target-C? - PullRequest
49 голосов
/ 25 июня 2009
  1. Кто-нибудь знает, где я могу найти хорошее объяснение / учебное пособие о том, что и как работает делегат приложения в objective-C?
  2. Две мои книги недостаточно подробно описаны на delegates и не очень хорошо объясняют их, чтобы я по-настоящему понял их силу и функции.

Ответы [ 5 ]

77 голосов
/ 25 июня 2009

Если есть сомнения, проверьте документы !

По сути, делегирование - это способ взаимодействия объектов друг с другом без создания сильных взаимозависимостей между ними, поскольку это делает дизайн вашего приложения менее гибким. Вместо объектов, контролирующих друг друга, у них может быть делегат, которому они отправляют (или делегируют) сообщения, и делегат делает все, что он делает, чтобы ответить на это сообщение и действовать в соответствии с ним, а затем обычно что-то возвращать другому объекту. .

Делегирование также является лучшей альтернативой подклассам. Вместо того, чтобы создавать собственные настраиваемые классы, чтобы немного изменить поведение других объектов или передавать им данные, делегирование позволяет объектам отправлять сообщения своим делегатам, чтобы они выполняли за них работу без дополнительных затрат на создание подклассов для внесения незначительных изменений в другие объекты.

Конечно, основным недостатком делегирования является то, что доступные методы делегирования зависят от того, что инженеры Apple предвидят как полезные, и каких общих реализаций они ожидают от людей, что накладывает ограничение на то, чего вы можете достичь. Хотя, как отметил Куинн Тейлор, это относится к платформам Cocoa и поэтому не применимо во всех ситуациях.

Если делегирование является опцией над подклассами, воспользуйтесь им, потому что это намного более чистый способ управления вашим кодом и взаимодействиями между объектами.

21 голосов
/ 11 октября 2012

Как описано выше, делегат - это не функция iOS или Objective-C, а просто методика программирования и не требует специальной языковой поддержки.

Класс (e, g, classA) можно записать так, чтобы его методы getData и doSomething могли быть реализованы не самим собой, а делегатом (возможно, потому что 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 хочет делегировать - с помощью подклассов можно переопределить любой метод.

Протоколы используются для формализации процесса делегирования путем определения списка методов, которые делегат должен реализовать либо * (делегатор не предоставляет версию метода и метода по умолчанию). должен быть реализован где-то) или может быть дополнительно реализован делегатом (т. е. делегат имеет свою собственную версию или не имеет значения, если метод не реализован).

12 голосов
/ 19 июля 2011

Делегаты - это шаблон дизайна; нет специального синтаксиса или языковой поддержки.

Делегат - это просто объект, которому другой объект отправляет сообщения, когда происходят определенные события, так что делегат может обрабатывать специфичные для приложения детали, для которых исходный объект не был разработан. Это способ настройки поведения без создания подклассов.

4 голосов
/ 09 августа 2013

Я пытаюсь разработать это с помощью простой программы

Два класса

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 Свойство объекта ученика 'student' будет присвоено объекту ученика.

    1.2 self.student.delegate = self означает, что делегат объекта ученика будет указывать на объект учителя

  2. Из основного метода, когда [student studentInfo] будет вызываться

    2.1 [self.delegate responseToSelector: @selector (teacherName)] Здесь делегат уже указывает на объект учителя, поэтому он может вызывать метод экземпляра teacherName.

    2.2, так [self.delegate executeSelector: @selector (teacherName)] выполнит легко.

Похоже, что объект Учителя назначает делегат объекту студента для вызова своего собственного метода.

Это относительная идея, когда мы видим, что объект ученика называется методом teacherName, но в основном это делается самим объектом учителя.

0 голосов
/ 15 января 2014

Представьте, что вы звоните по телефону и заказываете пиццу. Затем мальчик-доставщик пиццы прибывает к вам домой (это делегат), и когда Вы платите за пиццу, мальчик доставки пиццы возвращает деньги в свой ресторан.

вы = доставщик объектов = делегат ресторан = объект

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...