Интерфейс target-c - объявление переменной или просто свойства? - PullRequest
7 голосов
/ 30 января 2012

В Obj-c при объявлении переменной в @ interface

@ interface: NSObject {MyObject * myObject}

@ свойство (небезопасное, неатомное) MyObject * myObject;

Vs.Объявите его только как свойство

@ interface: NSObject {}

@ свойство (небезопасное, неатомное) MyObject * myObject;@ end

Не объявить здесь какую-либо переменную?

С уважением, Кристиан

Ответы [ 2 ]

10 голосов
/ 30 января 2012

@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.

9 голосов
/ 30 января 2012

Пропуск объявления ивара - это прекрасно, но вы не сможете увидеть значение ивара в Xcode IDE.Однажды Apple может это исправить.

Вы сможете «по» ивару проверить его в GDB или lldb.

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