@property
определяет интерфейс, а не реализацию.В вашем случае вы определяете свойство readwrite.Это означает, что вы обещаете реализовать -myObject
и -setMyObject:
.Это не имеет ничего общего с иваром.
Теперь наиболее распространенный способ реализации этих методов - поддержка их с помощью ивара.Для удобства ObjC позволяет автоматически генерировать требуемые методы в хранилище ivar, используя @synthesize myObject=myObject_;
. В нем говорится «создайте необходимые методы для свойства myObject
, используя автоматически созданный ivar с именем myObject_
».Ivar myObject_
- это настоящий ivar, и вы можете получить к нему доступ в обычном режиме (хотя, как правило, не следует; вам следует использовать средства доступа).
Вместо использования @synthesize
вы можете просто реализовать -myObject
и -setMyObject:
.Вы можете даже использовать @dynamic myObject;
, чтобы сказать компилятору «не беспокойтесь о реализациях этого свойства; оно будет корректно обрабатываться во время выполнения».
Есть несколько различий между @property
и простообъявляя методы, но в принципе, эта строка:
@property (nonatomic, readwrite, strong) MyObject* myObject;
концептуально такая же:
- (MyObject *)myObject;
- (void)setMyObject:(MyObject *)anObject;
Объявление самого ивара здесь не имеет никакого реального влияния.Вам все еще нужно как-то реализовать методы.Если ваш названный ивар такой же, как и используемый @synthesize
, то @synthesize
просто не создаст новый ивар.
На практике я не рекомендую людям объявлять ивара больше.Я рекомендую просто использовать публичные и частные свойства с @synthesize
для создания любых необходимых ivars.Если по какой-то причине вам нужен ручной ивар, то я рекомендую указывать его в блоке @implementation
, а не @interface
.