Как вызвать функцию делегата без предупреждения «метод экземпляра не найден» в ios? - PullRequest
2 голосов
/ 13 января 2012

В приложениях, над которыми я работал, я часто находил такие строки кода

[делегат aFunction];

, которые генерировали «метод экземпляра« aFunction », а неfound (тип возвращаемого значения по умолчанию равен id) "warning

Теперь я провел небольшое исследование SO и обнаружил, что предупреждение можно удалить, объявив функцию для случаев, когда вы вызываете его для self ([selfaFunction];), но ни один из ответов ничего не сказал о моем случае, когда я использую делегата.

Итак, короче говоря, что я могу сделать, чтобы правильно вызвать метод делегата внутри другого класса?Вещи, кажется, работают нормально, так что это не главная проблема, но предупреждение означает, что я не делаю что-то не совсем правильно, поэтому я хотел бы узнать, что является лучшим методом для таких случаев

Спасибо за вашу помощьзаранее!

1 Ответ

8 голосов
/ 13 января 2012

Итак, если я вас правильно понимаю, ваши проблемы можно устранить, объявив протокол следующим образом:

@class SomeClass;
@protocol SomeClassDelegate <NSObject>
@required
- (void)thisObjectDidSomething:(SomeClass*)instance;
@optional
- (void)thisObjectDidSomethingUnimportant:(SomeClass*)instance;
@end

Тогда ваш делегат ivar и свойство выглядят так (используйте assign вместо слабого, если вы не используете ARC):

@interface SomeClass () {
    __weak id<SomeClassDelegate> delegate_;
}
@property (weak) id<SomeClassDelegate> delegate;

И в файле .h любого класса, который собирается реализовать этот протокол, сделайте это:

@interface TCReader : NSObject <SomeClassDelegate> {

}

Поскольку безопасно вызывать селекторы для nil, для требуемых методов вы можете просто:

[self.delegate thisObjectDidSomething:self]

Но для дополнительных методов вам лучше:

if ([self.delegate respondsToSelector:@selector(thisObjectDidSomethingUnimportant:)]) {
    [self.delegate thisObjectDidSomethingUnimportant:self]
}

Суть в том, что, объявляя и используя протокол, вы даете XCode знать, что эти методы определены для объектов, реализующих протокол. Если вам требуется, чтобы ваш делегат реализовал этот протокол, то XCode знает, что ваш делегат определил эти методы.

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