Переопределить геттер нужно только @synthesize
Я хочу ovveride getter для ленивых экземпляров и оставить настройки по умолчанию.
Нужно ли @synthesize?
Зачем?
@interface Foo()
@property (strong, nonatomic) NSObject *bar;
@end
@implementation Foo
- (NSObject *)bar
{
if(!_bar) _bar = [[NSObject alloc] init];
return _bar;
}
@end
Обновление: я изменил переменную и имя класса, потому что это сбивало с толку. От колоды и карты до фу и бара.
3 ответа
Нет, вам нужно только явно синтезировать (чтобы получить синтезированный ivar), если вы явно реализуете все методы доступа (как getter, так и setter для readwrite
свойства, просто получатель для readonly
свойства). Вы написали геттер для этого readwrite
свойство, но не сеттер, поэтому ивар все равно будет синтезирован для вас. Таким образом, поскольку ваш код стоит, вам не нужно явно @synthesize
,
Если вы сделали это свойство readonly
затем реализация getter не позволит автоматически синтезировать ваш ivar. Аналогично, так как это readwrite
, если вы реализовали и геттер, и сеттер, это потребовало бы от вас синтезировать ивар (если вы этого хотели).
Не используйте ленивую инициализацию таким образом. Колода бесполезна без карт, и, таким образом, ленивая инициализация не дает вам ничего, кроме неопределенного потребления ЦП, когда бы ни был первый вызов этого геттера. К счастью, простое создание изменяемого массива ничего не стоит (что также является причиной не использовать отложенную инициализацию).
Кроме того, продажа изменяемой коллекции нарушает инкапсуляцию. Колода должна содержать всю логику для определения того, какой набор карт она содержит и в каком порядке. Продавая изменчивую коллекцию, внешний бит кода может изменить этот порядок за спиной колоды.
Помимо этого, что это вообще означает "устанавливать" карты колоды? Переход по этому маршруту, казалось бы, толкает всю логику, связанную с поддержанием колоды за пределами класса Deck, и возникает вопрос, почему колода является не чем иным, как простым старым массивом в любом классе, использующем колоду.
В iOS 7 вам обычно не нужно синтезировать. Если вам нужен собственный геттер, просто определите его. Вы получите сеттер по умолчанию бесплатно.