Использование свойств в протоколах и @synthesize в качестве ярлыка для реализации протокола - PullRequest
1 голос
/ 01 февраля 2012

Скажем, я создаю класс и протокол, подобный этому:

@protocol MyProtocol
@required
- (void) doSomething;
@end

@interface MyClass id<MyProtocol>
@property int aNumber;
@end

@implementation MyClass
@synthesize aNumber = aNumber_;
- (void) doSomething { aNumber_++; }
@end

Очевидно, что я могу передавать экземпляры MyClass, обрабатывая их как id<MyProtocol> s. Я не могу получить доступ к aNumber, хотя, если я имею дело с чем-то объявленным как id<MyProtocol>. Это ожидается.

Мне нужно было сделать это недавно. Я хотел продолжать использовать протокол для ссылки на экземпляры моего класса (время выполнения определено), но я также хотел получить доступ к свойствам классов. Я обнаружил, что могу сделать это:

@protocol MyProtocol
@required
- (void) doSomething;
- (int) aNumber;
@end

И теперь везде, где у меня есть экземпляр id<MyProtocol>, я также могу вызывать [instance aNumber], без необходимости напрямую кодировать средства доступа - вызов synthesise эффективно реализует для меня эту часть протокола , Я мог бы также добавить сеттер, если захочу.

Я наткнулся на преднамеренную особенность или это плохая идея, которая в итоге вызовет у меня проблемы в будущем?

Спасибо

1 Ответ

5 голосов
/ 01 февраля 2012

Совершенно намеренно.

Когда вы пишете:

@property int aNumber;

это просто сокращение:

- (int) aNumber;
- (void) setaNumber:(int)value;

и точечная запись object.property - это просто сокращение для вызова одного из этих двух методов (в зависимости от того, читаете ли вы свойство или присваиваете ему свойство).

Оператор @synthesize просто пишет для вас два метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...