Вот ситуация, с которой я часто сталкиваюсь, достаточно, чтобы шаблонный код был расточительным, и достаточно, чтобы я был уверен, что не могу быть единственным. Является ли это однообразным, есть ли лучший способ, или мне просто нужно делать это каждый раз?
@interface SomeUIElement : UIView
@property CGFloat insetMargin; // <-- just an example of a UI parameter
@end
@implementation SomeElement
- (void)setInsetMargin:(CGFloat)insetMargin {
_insetMargin = insetMargin;
[self setNeedsDisplay]; // <-- the only thing that stops it being synthesized
}
@end
теперь это вызывает предупреждение о компиляции, что у меня нет геттера, чтобы избавиться от этого, я могу добавить
- (CGFloat)insetMargin {
return _insetMargin;
}
но теперь он жалуется, что у меня нет ivar (поскольку определенный геттер и сеттер означает, что он не создан для меня), поэтому мне нужно добавить
@interface SomeUIElement () {
CGFloat _insetMargin;
}
а это означает, что у нас есть существенные накладные расходы только потому, что мы хотим принудительно обновить отображение при изменении свойства.
Есть ли (а) какой-то способ сообщить ObjC, что я действительно намеревался создать для меня геттер и ивар, поэтому мне нужно только написать сеттер, или (б) лучший способ запросить обновление отображения, когда свойство, связанное с внешний вид меняется?
Как Apple SDK это делает (я предполагаю, что не пропустил какой-то способ просмотра, скажем, источник UILabel)?
@property (nonatomic, assign) CGFloat insetMargin
, вам не нужен геттер или ивар. - person rmaddy   schedule 03.08.2013@
перед моим именем пользователя, поэтому я не получил ваш комментарий раньше. Использованиеassign
в объявлении собственности означает контракт. Вы позволяете клиентам кода узнать семантику свойства. Конечно, вы хотите, чтобы ваша реализация соблюдала этот контракт. - person rmaddy   schedule 03.08.2013