В чем разница между _name и self.name, если name было строкой NSString - PullRequest
0 голосов
/ 09 февраля 2012

Какая разница, если я позвонил

NSString *theNameToDisplay = _name;

или

NSString *theNameToDisplay = self.name;

Я знаю, что это может быть глупый вопрос, но я вижу, что обе версии часто используются, и я не вижу разницы в выводе?

Спасибо!

Ответы [ 6 ]

3 голосов
/ 09 февраля 2012

Предположим, что в вашем файле .m есть эта строка (и у вас нет переопределенных методов для прямого доступа к _name)

@synthesize name = _name;

Это означает, что свойство name (self.name) будет использовать переменную _name при попытке доступа к нему. В этом случае self.name равно _name


Но если у вас есть динамическое свойство для имени, что-то вроде этого:

-(NSString)name{
    return @"1234";
}

тогда есть разница. self.name всегда будет возвращать 1234, но _name может быть не равно этому значению.

Пример:

_name = @"555";
NSLog(_name);
NSLog(self.name);

Результат:

2012-02-09 14:27:49.931 ExampleApp[803:207] 555
2012-02-09 14:27:49.933 ExampleApp[803:207] 1234
1 голос
/ 09 февраля 2012

Прежде чем задавать такой вопрос, вам лучше прочитать любой учебник по объективным свойствам c ... попробуйте этот http://www.raywenderlich.com/2712/using-properties-in-objective-c-tutorial или любой другой. Если вы создали свойство, вы должны (хорошо, должны) получить доступ к ivar через него, чтобы вызывался метод setter:

- (void)setMyProp:(NSArray *)myProp {
   [myProp retain];
   [_myProp release];
   _myProp = myProp;
}
0 голосов
/ 09 февраля 2012

Смотрите другие ответы о настройщике свойств, это о геттерах:

Обычно нет никакой разницы в использовании геттера (self.name) или ивара напрямую (_name, name, name_ в зависимости от вашего вкуса).

Однако могут быть случаи, когда что-то (полу) разумное происходит под капотом, и добытчик скрывает какую-то магию. Представьте себе этот пользовательский геттер:

-(NSString*)name
{
    if ( _name == nil ) return @"No name set";
    return _name;
}

Или представьте, что вы переделываете свой класс, и _name ivar отбрасывается в пользу свойства person, содержащего больше информации, и вы хотите, чтобы ваш код продолжал работать без особых хлопот:

-(NSString*)name
{
    return self.person.name;
}

Людям может или не может понравиться такой подход, но это выходит за рамки этого вопроса. Дело в том, что это может случиться. Поэтому лучший выбор - всегда использовать геттер.

0 голосов
/ 09 февраля 2012

Рассмотрим следующий код:

NSString *theNameToDisplay = _name;
self.name = @"foo";
NSLog(@"%@", theNameToDisplay);

Это может привести к сбою, поскольку при установке свойства старое значение будет освобождено, поэтому theNameToDisplay станет висящим указателем.Обратите внимание, что с NSString это не обязательно происходит, особенно с литеральными строками, но это может произойти.Это также не произойдет, если вы включите ARC.

self.name, с другой стороны, примерно эквивалентно: [[_name retain] autorelease], поэтому theNameToDisplay будет оставаться действительным до тех пор, пока метод не вернется.

0 голосов
/ 09 февраля 2012

на самом деле не имеет значения, при назначении другому объекту, но это будет иметь большое значение, если присвоение будет выполнено иным способом, например self.name = theNameToDisplay;, это будет отличаться, так как theNameToDisplay будет зависеть от @property атрибуты.

0 голосов
/ 09 февраля 2012

Первый - это прямой доступ к переменной. Второй - доступ к нему через свойство.

...