Короче говоря, вы не можете [иметь частные ивы].
Альтернатива - объявить класс в вашем файле реализации, который содержит все состояния, а затем обработать его как структуру.
.m:
@interface PrivateGoo:NSObject
{... ivars ...}
... props
@end
@implementation PrivateGoo
... @synth or not
Затем в .h объявите ивару как id privateGoop;
. Если скорость поиска ужасна, используйте ((PrivateGoo*)privateGoop)->iVar;
в своем файле .m. Будьте осторожны с управлением памятью, если вы делаете.
Обратите внимание, что у этого есть несколько преимуществ, даже если это кажется на первый взгляд странным. А именно, это делает рефакторинг из PrivateGoo тривиальным; если ваша инкапсуляция данных внезапно обнаружит необходимость иметь бизнес-логику или сделать ее более универсальной, это будет тривиально. С GC компилятор установит информацию о макете для PrivateGoo и будет полностью управлять всей памятью. Использование структуры требует небольшого количества скачков, чтобы заставить работать правильно - правильные схемы распределения и т. Д.
<Ч />
Извините - на самом деле не ответили на вопрос.
Синтезированные ивары работают точно так же, как и обычные ивары, за исключением того, что вам не нужно объявлять их в заголовке. В них нет ничего особенного, кроме этого. Обратите внимание, что синтезированные ивары не требуются, чтобы избежать проблемы хрупкого базового класса.
Директивы @private
, @protected
и @public
существуют для удобства компилятора; дать ему возможность предупреждать (или сообщать об ошибке), когда вы получаете доступ к тому, что объявлено недоступным. Все еще существует относительно плоское пространство имен OBjective-C для контента, и именно это мешает вам иметь iVar с тем же именем в подклассе.
Хрупкая задача базового класса ортогональна свойствам и синтезированным иварам. Хрупкие базовые классы были адресованы в современном ABI Objective-C 2.0 для iPhone OS и 64-битной Mac OS X. 32-битная Mac OS X сохраняет устаревшее поведение по причинам двоичной совместимости.