2009-08-12 4 views
0

Короткий вариант заключается в том, что у меня есть протокол, который имеет необязательный параметр. Когда я создаю класс, который реализует его с iPhone SDK 3.x, он компилируется просто отлично, без ошибок или предупреждений. Когда я использовал 2.x SDK, я получил следующее предупреждение:Протоколы с дополнительными свойствами?

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 версии 10.5 протоколы не могут включать дополнительные объявленные свойства». Понятно, что здесь не совсем так.

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

@protocol MyProtocol 
    @required 
    - (void) method:(NSString*)param; 
    @optional 
    @property (nonatomic,retain) NSString* field; 
@end 

@interface MyClass : NSObject<MyProtocol> { 
} 
- (void) method:(NSString*)param; 
@end 

ответ

2

iPhone SDK не совсем идентичен оригинальной версии Mac OS X. Очевидно, что более новая версия набора инструментов включена в SDK 3, который больше похож на тот, что у Snow Leopard.

+0

Я думаю, что ты прав. Знаете ли вы о предпочтительном способе устранения предупреждения? Или это просто случай «не делай этого» с помощью SDK 2.x? –

+0

Ну, не делай этого или примирись с предупреждением. Это новая функция в SDK 3. – Chuck

0

@optional был введен в Objective-C 2.0, поэтому он не будет применяться для более старых версий SDK. Лучше всего, чтобы определить, должен ли он присутствовать (возможно, нет), а затем #ifdef, что вокруг с

#if __OBJC2__ 
@optional 
@property ... 
#endif 

Затем он должен собрать только под OBJC2, и он не будет присутствовать в старых системах, как часть самого протокола.

+2

Я считаю, что все версии iPhone SDK поддерживают Objective-C 2.0, выпущенный с Leopard в конце 2007 года. Напомним, что iPhone SDK не был выпущен до середины 2008 года. –

1

simnple способ убрать предупреждение, чтобы добавить

@dynamic поля;

к вашей реализации. Это говорит компилятору, что вы обеспечите реализацию динамически, что вы привыкли, потому что это необязательное свойство, но это должно закрыть компилятор.

Смежные вопросы