Почему Xcode 4 автоматически генерирует переменную экземпляра? - PullRequest
5 голосов
/ 07 ноября 2011

Я пришел из разработки на C # и только начал изучать Objective-C и Xcode 4. Насколько я понимаю, "@synthesize" заменяет методы получения / установки для свойств, если вам не нужно проверять / контролировать значения, которые читаются или записываются.

Но почему Xcode 4 автоматически создает для меня переменную экземпляра?

Разве этого не достаточно:

@synthesize myProperty;

вместо:

@synthesize myProperty = _myProperty;

Зачем мне хотеть использовать / иметь переменную экземпляра вместо фактического свойства, если у меня нет / не нужны какие-либо методы получения или установки?

Заранее спасибо!

MemphiZ

EDIT:

Я понимаю, что @synthesize заменяет геттеры / сеттеры, но для чего эта часть хороша: = _myProperty;? Зачем мне хотеть иметь переменную экземпляра, если бы я мог использовать «myProperty» напрямую? Я бы понял, используя "_myProperty", если сеттер, например, будет проверять состояние значения. Если я затем хочу пропустить эту проверку, я бы использовал _myProperty. Но так как я использую @synthesize, у меня нет установщика, который делает некоторую проверку. Так почему же у меня есть / нужна переменная экземпляра?

ОТВЕТ:

Смотрите комментарии в посте MattyG!

Ответы [ 2 ]

14 голосов
/ 07 ноября 2011

Это соглашение, используемое для напоминания программисту о необходимости доступа к переменным экземпляра с помощью методов установки и получения с помощью self. Так что если вы используете:

@synthesize myProperty = _myProperty;

Затем для прямого доступа к переменной необходимо написать:

_myProperty = something;

Чтобы получить доступ к переменной через ее установщик, вы должны написать:

self.myProperty = something;

Преимущество в том, что если вы забудете получить доступ через себя. тогда компилятор предупредит вас:

myProperty = something;  //this won't compile

См. Также этот Вопрос .

0 голосов
/ 07 ноября 2011

Ну, вы ОБЪЯВЛЯЕТЕ переменную экземпляра свойства в файле .h, а также само свойство. Интерфейс для свойства, а также переменная экземпляра, которую он будет использовать, были установлены с этим ... его реализация не имеет. Вот тут и появляется ключевое слово @synthesize. Оно просто реализует свойство для вас, так что вам не нужно писать его самостоятельно.

Вот способы объявить свойства в C #

private int _int1;
public int int1 {
  get { return _int1; }
  set { _int1 = value; }
}

Это довольно распространенный фрагмент кода, и C # позволяет сокращать его, чтобы не вводить одно и то же снова и снова

public int int1 { get; set; }

Разница между этими двумя сегментами кода заключается в том, что частная переменная "_int1" не существует в последнем, поскольку C # создает переменную внутри. Ключевое слово @synthesize хорошо, потому что оно избавляет вас от необходимости записывать один и тот же код снова и снова, в то же время позволяя получить доступ к переменной экземпляра, на которой он основан.

Редактировать. Также важно отметить, что геттеры и сеттеры существуют в цели C. Они просто имеют разные имена, чем в C #, где они помечены как get {} и set {}. В задаче C метод получения - это метод с тем же именем, что и у его переменной экземпляра, а метод установки - это метод со словом «set», за которым следует имя переменной экземпляра с заглавной буквой.

Итак, допустим, у вас есть это в вашем .h файле

int myVar;
...
@property(nonatomic, assign) int myVar;

Вы можете самостоятельно реализовать методы получения и установки в файле .m

-(int)myVar {
  return myVar;
}

-(void)setMyVar:(int)newVar {
  myVar = newVar;
}

или вы можете просто использовать @synthesize для автоматической записи метода получения и установки

...