2010-07-21 5 views
4

У меня есть протокол:Может ли унаследованный @property не удовлетворять <protocol> @property?

@protocol Gadget <NSObject> 

@property (readonly) UIView *view; 

- (void) attachViewToParent:(UIView *)parentView; 

@end 

и «абстрактный» базовый класс, с реализацией (как добытчик, не показан) -(UIView *)view:

// Base functionality 
@interface AbstractGadget : NSObject { 
    UIView *view; 
} 

@property (readonly) UIView *view; 

@end 

Но когда я реализовать Gadget протокол в подклассе AbstractGadget, например, так:

// Concrete 
@interface BlueGadget : AbstractGadget <Gadget> { 
} 

- (void) attachViewToParent:(UIView *)parentView; 

@end 


@implementation BlueGadget 

- (void) attachViewToParent:(UIView *)parentView { 
    //... 
} 

@end 

Я получаю ошибку компилятора говорить мне "warning: свойство 'view' требует метода '-view', который будет определен. " Я могу сделать это уйти с помощью @dynamic, или добавление метода заглушки:

- (UIView *) view { 
    return [super view]; 
} 

Но я просто хочу знать, если я делаю что-то, что не поддерживается, то, что я не должен делать, или если это просто ограничение/ошибка в компиляторе?

ответ

5

Объявив свойство как @dynamic, вы сообщаете компилятору, что свойство getter (и setter if required) реализовано в другом месте (потенциально во время выполнения). Для меня это звучит вполне разумно.

Для получения дополнительной информации см. The Docs.

+0

+1 так же, как и мой ответ, но гораздо лучше и со ссылкой на документы. – JeremyP

+0

Мне придется протестировать это с помощью Clang и Xcode 4, когда я смогу взять их в руки. – Sophistifunk

0

Вот правило для переменной, свойства и синтезировать в Objective-C:

Если у вас есть собственность, вы должны иметь @synthesize или объявить @dynamic и написать геттер и сеттер метод самостоятельно.

Итак, поскольку у вас есть свойство, называемое view, вы должны объявить @synthesize. Это должно быть так. Ничто не связано с @protocol, inheritance

+0

Извините, я должен был быть более конкретным. Существует полная реализация представления «- (UIView *)» в AbstractGadget. – Sophistifunk

+0

Можете ли вы показать мне свой код в реализации AbstractGadget. Теперь что-то не так, потому что обычно это работает для меня – vodkhang

+2

Поскольку свойство реализовано в базовом классе, вы используете @dynamic в подклассе. – JeremyP

2

Я также столкнулся с этой точной проблемой. Это одна из ситуаций, в которой существует @dynamic.