2011-03-08 3 views
1

Предположим, у меня есть переменная экземпляра NSDate * date; и я (например, в viewDidLoad):Есть ли разница, использующая self.variable = 'some value' только для переменной = 'some value' для переменных экземпляра

date = [NSDate dateWithTimeIntervalSinceNow:0]; 

или

self.date = [NSDate dateWithTimeIntervalSinceNow:0]; 

Есть ли разница между этими двумя? И если есть один, который является правильным и, возможно, почему :)

Thanx ответы Ладислав

ответ

4

Да, есть разница. Первый раз присваивает значение переменной, а другой присваивание собственности и, таким образом, то же самое, как написание:

[self setDate:[NSDate dateWithTimeIntervalSinceNow:0]]; 

Например, если вы определили вашу собственность как @property(retain) NSDate *date; реализации по умолчанию (через @synthesize date) выпустит старое значение и сохранит новое значение. Вы также можете предоставить пользовательскую реализацию setDate: и выполнить некоторые действия, когда назначается дата. Все это не происходит, если вы просто назначаете значение переменной.

+0

Означает ли это, что если я дам = [NSDate dateWithTimeIntervalSinceNow: 0]; дата будет автореализована, и когда я попытаюсь получить доступ к этой переменной на более позднем этапе, я могу получить EXC_BAD_ACCESS? – Ladislav

+1

Точно (если вы не сохраните его позже). Или иногда вы не получаете EXC_BAD_ACCESS, но какой-то другой объект был создан точно в одном месте, и из-за этого вы получаете смешные результаты. – DarkDust

+0

Это было то, что происходило ... так как иногда я получаю EXC_BAD_ACCESS, а иногда я бы не хотел ... Thanx – Ladislav

1

Объявив self.date = некоторое значение; вы на самом деле делаете следующее:

если (дата) [дата выпуска]; date = [некоторое значение сохраняется];

+1

только если свойство определяется как (сохранить). –

+0

Кроме того, если бы в том порядке, в котором вы писали плохие вещи, это произойдет, если вы повторно назначьте то же значение, что и релиз, может привести к тому, что счетчик ссылок опустится до 0 и таким образом освободит объект. Правильная последовательность состоит в том, чтобы сначала сохранить новое значение, затем отпустить старое значение, а затем присвоить новое значение переменной. – DarkDust

4

Да. self.date вызывает сеттер свойства, называемого датой, и если вы дали что-то вроде сохранения в спецификации свойства или если вы предоставили свои собственные аксессоры, они будут вызваны.

Всегда рекомендуется использовать self.date, чем дата, в большинстве случаев, если вы не уверены. Также обратите внимание, что настоящий компилятор позволяет просто декодировать свойство и синтезировать, не используя собственное объявление переменной. Это предпочтительнее, чем объявление явной переменной. Если вы используете эту конструкцию, вы получите ошибки компилятора всякий раз, когда используете переменную напрямую, не используя аксессор, что приятно иметь преимущество.

+0

Функция * declare-property-without-backing-variable * работает только на x64 и iOS (http://stackoverflow.com/questions/4511700/synthesizing-a-property-without-instance-variables), а не на x86 (32-разрядный режим) и PPC, BTW. – DarkDust

+0

Спасибо DarkDust. Это хорошо знать. Из связанного вопроса кажется, что если мы строим для pre iOS 4, нам нужно объявить опорные переменные. – Krishna

1

Если вы используете дату = [NSDate dateWithTimeIntervalSinceNow: 0]; здесь дата - это объект, выпущенный автоматически.

Но если вы используете self.date и его свойство сохраняется, это не авто выпустили объект, мы должны явно освободить Дата

+0

... мы должны явно выслать дату * в 'dealloc' *. – DarkDust

Смежные вопросы