2015-09-01 6 views
0

Итак, если у меня в iOS (с Objective C, не уверен, что это то же самое для Swift), например.В чем разница между self -> _ var и simple _var?

@property (nonatomic, copy) NSString *aString; 

И тогда некоторые, где в коде у меня есть

// Simple ivar access in some method 
_aString = anyStringOrNil; 

// Self-> ivar access in some other method 
self->_aString = anyStringOrNil; 

Я хотел бы знать разницу между использованием одного или другого

+0

Я думаю, что должен ответить на ваш вопрос. Просто [Изменить] ваш вопрос и пинговать меня, если это не так. –

+0

Спасибо большое @JoshCaswell, мне нужно улучшить свои навыки поиска! но да, у этого есть на самом деле ответ http://stackoverflow.com/questions/1314173/using-self-ivar-when-accessing-instance-variables-directly –

ответ

0

Как вы вывесили, те идентичны. Однако существует разница между прямым доступом к ивару и прохождением через собственность. Если вы установите строку как так:

self.aString = someString; 

Что бы пройти через автоматически сгенерированный сеттер, который, на основе вашей декларации собственности будет сделать копию SomeString. Это предпочтительнее в случае работы с изменяемыми строками. Вы не хотите, чтобы строка менялась из-под вас. В обоих примерах, которые вы использовали, вы непосредственно устанавливаете значение _aString в ссылку на строку, поэтому, если строка является изменяемой строкой, принадлежащей кому-то другому, она может измениться без предупреждения и привести к неожиданным результатам.

Обычно лучше пройти через сеттер (self.property = foo), а не напрямую обращаться к ivar, так как возможно, что у установщика для свойства есть какое-то поведение, которое вы можете захотеть, и прямой доступ к нему обходит это. Конечно, бывают ситуации, когда требуется прямой доступ к ivar, но лучше всего использовать свойство по умолчанию.

+0

Спасибо! но я на самом деле сейчас различия между использованием свойств и ivars, я просто хотел знать, есть ли разница между доступом к ivar с self-> или просто использованием ivar, если они идентичны, то почему у нас есть два разных способа сделать это? –

+0

@BlackSheep Всегда есть разные способы сделать одно и то же. Мой фрагмент кода выше может быть записан как '[self setAString: someString]'. В случае установки ivar с использованием разыменования, если ivar не был назван с подчеркиванием, тогда разыменование его может прояснить, что переменная, которую вы устанавливаете, является ivar без необходимости переходить и переименовывать ее. В общем, использование разыменования для входа в ivar - это то, что я никогда не видел в живом коде, поэтому я не уверен, почему это было бы неприятно. –