Какая разница в определении переменной только в методе interface () файла .h без его синтеза? - PullRequest
2 голосов
/ 10 января 2011

Я определяю переменную в методе интерфейса .h файла следующим образом ...

@interface ......{
  int a;
}

Тогда я использую его в файле .m, он отлично работает ....

Также я изменил код как

@interface ......{
  int a;
}
@property(nonatomic) int a;

в .h файле и в .m файле я устанавливаю значение int как

@synthesize a;

Теперь тоже работает нормально ...

Чем отличаются оба случая?

Ответы [ 4 ]

2 голосов
/ 10 января 2011

В первом случае вы используете поле, с прямым доступом к нему.Во втором случае вы определяете свойство Objective C с помощью методов доступа.

1 голос
/ 10 января 2011

Объявляя ваше свойство 'a', вы разрешаете хранить int в вашем классе, и вы можете получить к нему доступ из вашего класса, но только в вашем классе.Если вы хотите, чтобы это было свойство, которое доступно другим объектам (публичное свойство), вам понадобятся методы получения и установки.

Объявляя его как @property в вашем .h и используя @synthesize в вашем .m вы автоматически создаете два метода:

[myObject a]; // your getter
[myObject setA:50]; // your setter

Здесь нужно помнить, что часто очень полезно использовать синтетические свойства даже в вашем классе, потому что они будутпозаботьтесь об управлении своей памятью.Например, когда вы помечаете @property как retain:

objectProperty = anObject; // just accessing locally, no memory management
self.objectProperty = anObject; // [anObject retain] will be called
self.objectProperty = nil; // [anObject release] will be called
0 голосов
/ 10 января 2011

Когда вы определяете и синтезируете свойство, вы указываете компилятору генерировать для него методы ivar и accessor (- (int) a; и - (void) setA: (int) a_;)). Эти методы можно вызывать явно или неявно, используя точечный синтаксис:

self.a = num; // [self setA:num] gets called 
0 голосов
/ 10 января 2011

Если вы определяете и синтезируете свойство, вы также можете получить доступ к значению, используя int value = self.a; self.a = newValue;. Это также делает переменную доступной для других объектов. Без свойства вы не можете использовать self. для доступа к переменной, и для других объектов нет автоматического способа получить к ней доступ.

...