Вопрос

Вкратце, у меня есть протокол с необязательным параметром.Когда я создаю класс, реализующий его, с помощью 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

В обоих случаях это работает нормально.

Итак, два вопроса:

  1. Как правильно исправить предупреждение?я добавил @dynamic к реализации, которая на самом деле неверна, поскольку свойства на самом деле не существует.
  2. Почему работает в 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 и не будет присутствовать в старых системах как часть самого протокола.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top