Предупреждение компилятора «не найдено в протоколе (ах)» при использовании [[[UIApplication sharedApplication] делегат] myClass Property]? - PullRequest
1 голос
/ 13 мая 2009

У меня есть myClass, созданный моим appDelegate, у меня есть другой класс, newClass, созданный myClass. Из экземпляра newClass я хочу получить доступ к свойству в экземпляре myClass, который его создал. Я сделал это:

[[[UIApplication sharedApplication].delegate myClass] property]

Это работает, я действительно могу получить свойство, но я получаю это предупреждение от Xcode:

warning: "-myClass" not found in protocols
warning: no "-myClass" method found  
(messages without a matching signature will be assumed to return "id" and accept "..." as arguments)

Свойство newClass было правильно объявлено в файлах .h и .m, его свойства установлены и синтезированы.

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

Должен ли я игнорировать предупреждение в Xcode?

Есть ли лучший способ получить доступ к свойству экземпляра myClass?

Ответы [ 2 ]

4 голосов
/ 13 мая 2009

Посмотрите документацию для - [делегат UIApplication]. Обратите внимание, что он имеет тип возврата:

id <UIApplicationDelegate>

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

Вы могли бы немного взломать это, чтобы работать так:

[[(MyAppDelegateClass *)[[UIApplication sharedApplication] delegate] myClass] property]

Но это было бы плохой практикой. Вместо этого я предлагаю вам сделать так, чтобы ваше приложение делегировало синглтон, чтобы вы могли сделать:

[[[MyAppDelegateClass sharedApplicationDelegate] myClass] property]
0 голосов
/ 13 мая 2009

Я думаю, что во время компиляции Xcode не может сделать скачок из свойств и обычного Objective-C. Он не может найти недвижимость, поэтому просто предположим, что вы знаете, что делаете, и заполните пробелы. Во время выполнения все очевидно хорошо.

Попробуйте вместо этого:

[[[[UIApplication sharedApplication] delegate] myClass] property];

Кстати, чтобы у вас не было кода, подобного этому, в вашем собственном коде. Обычно я делаю #define в заголовке делегата приложения:

#define APPDELEGATE (myAppDelegate *)[[UIApplication sharedApplication] delegate]

Итак, в коде я могу просто пойти:

[[APPDELEGATE myClass] property];
...