Протоколы с дополнительными свойствами?
-
13-09-2019 - |
Вопрос
Вкратце, у меня есть протокол с необязательным параметром.Когда я создаю класс, реализующий его, с помощью iPhone SDK 3.x, он компилируется нормально, без ошибок и предупреждений.Когда я использовал SDK 2.x, я получаю следующее предупреждение:
Class.m:68: warning: property 'field' requires method '-field' to be defined - use @synthesize, @dynamic or provide a method implementation
В обоих случаях это работает нормально.
Итак, два вопроса:
- Как правильно исправить предупреждение?я добавил
@dynamic
к реализации, которая на самом деле неверна, поскольку свойства на самом деле не существует. - Почему работает в SDK 3.x, но не в 2.x?Документы говорят: «На Mac OS X V10.5 протоколы не могут включать дополнительные объявленные свойства». Очевидно, что это не совсем так.
Вот краткий пример кода, который мне нужен, чтобы сделать вещи немного более очевидными, если я не совсем понял.
@protocol MyProtocol
@required
- (void) method:(NSString*)param;
@optional
@property (nonatomic,retain) NSString* field;
@end
@interface MyClass : NSObject<MyProtocol> {
}
- (void) method:(NSString*)param;
@end
Решение
iPhone SDK не совсем идентичен какой-либо конкретной версии Mac OS X.Очевидно, что в SDK 3 включена более новая версия набора инструментов, которая больше похожа на версию Snow Leopard.
Другие советы
Простой способ удалить предупреждение — добавить
@динамическое поле;
к вашей реализации.Это сообщает компилятору, что вы предоставите реализацию динамически, чего вы не сделаете, поскольку это необязательное свойство, но это должно отключить компилятор.
@optional был введен в Objective-C 2.0, поэтому он не будет применим к более старым версиям SDK.Лучше всего определить, должен ли он присутствовать (вероятно, нет), а затем #ifdef с помощью
#if __OBJC2__
@optional
@property ...
#endif
Тогда он должен компилироваться только под OBJC2 и не будет присутствовать в старых системах как часть самого протокола.