Постоянное предупреждение о "initWithDelegate"! - PullRequest
0 голосов
/ 17 апреля 2010

Это не фактическое сообщение об ошибке XCode, это предупреждение, которое преследует меня за долго. Я не нашел способа удалить его, и думаю, что, возможно, перешагнул какое-то неписаное правило соглашения об именах.

Если я создаю класс, чаще всего расширяющий NSObject, единственная цель которого состоит в том, чтобы выполнить какую-то задачу и отчитаться, когда у него есть данные, я часто даю ему удобный конструктор, такой как "initWithDelegate".

Первый раз, когда я сделал это в моем текущем проекте, был класс под названием ISWebservice, который имеет такой протокол:

@protocol ISWebserviceDelegate

@optional

- (void) serviceFailed:(NSError*) error;
- (void) serviceSuccess:(NSArray*) data;

@required

@end

Объявлено в моем интерфейсе ISWebservice.h, прямо под моими инструкциями импорта.

У меня есть другие классы, которые используют вспомогательный конструктор с именем "initWithDelegate". Например. «InternetConnectionLost.h», этот класс, однако, не имеет своих методов как необязательных, в объявлении нет тегов @optional @required, т. Е. Все они обязательны.

Теперь мое предупреждение появляется каждый раз, когда я создаю экземпляр одного из этих Классов с помощью удобных конструкторов, написанных позже, чем ISWebservice, поэтому при использовании класса "InternetConnectionLost", даже если весь класс, владеющий объектом "InternetConnectionLost", не имеет ничего общего с класс «ISWebservice», нет импорта, вызываются методы, нет ничего, выводится предупреждение: ClassOwningInternetConnectionLost 'не реализует протокол ISWebserviceDelegate

Я ничего не сломал, не рухнул во время выполнения или не причинил мне вреда, но он начал беспокоить меня, когда я близок к выпуску. Кроме того, поскольку несколько классов используют имя конструктора initWithDelegate, у меня есть 18 из этих предупреждений в моих результатах сборки, и я не уверен, что сделал что-то не так, будучи довольно новым на этом языке.

Надеюсь, кто-то может пролить немного света на это предупреждение, спасибо:)

Ответы [ 2 ]

4 голосов
/ 10 октября 2010

Причина в том, что у вас есть несколько интерфейсов в вашем проекте, которые имеют функции, определенные как initWithDelegate: (id).

Alloc возвращает только id, поэтому компилятор не знает тип, поэтому он не знает, какой initWithDelegate используется, и, по-видимому, использует первый из списка. Таким образом, вы получаете предупреждение, которое не имеет смысла.

Однако среда выполнения знает тип объекта и, следовательно, не имеет никаких проблем.

Решение, по-видимому, заключается в использовании более подробных методов инициализации, например. initWithWebServiceDelegate. Или разыграть после выделения:

[(Foo *)[Foo alloc] initWithDelegate:self]
0 голосов
/ 17 апреля 2010

Вы получаете предупреждение, потому что компилятор считает, что классы объявили, что они реализуют протокол ISWebserviceDelegate. Я сомневаюсь, что это как-то связано с методом intiWithDelegate, если только вы не наследуете метод или не определили метод в протоколе, который сам является расширением протокола ISWebserviceDelegate.

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

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

Если очистка не разрешается, я бы нашел проект на ISWebserviceDelegate и убедился бы, что он где-то не спрятан.

...