2013-02-23 2 views
0
// .h 
@property (strong, nonatomic) NSString *note; 

// .m 
@synthesize note = _note; 

- (id) initWithNote: (NSString *)note { 

    self = [ super init ]; 
    if (self) { 
     _note = note; // _note is just a instance variable. 
     self.note = note; // 'self.note = note;' is using setter method. 
     return self; 
    } 
    return nil; 
} 

@property (strong, nonatomic) NSString *note; влияет на методы настройки и геттера. И по умолчанию переменными являются тип __strong на ARC.Использование @property on ARC

В чем разница между _note = note; и self.note = note;? Вместо strong, retain на не-ARC сделать разницу в этой ситуации.

ответ

1

Они теперь фактически те же, если вы используете (nonatomic). Тем не менее, они будут отличаться, если вы используете (atomic) (настройка по умолчанию) или, что более вероятно, определить пользовательский сеттер:

- (void)setNote:(NSString *)note { 
    // Do something fancier than this 
    _note = note; 
} 
self.note = note; // use the custom setter 

против

_note = note; // set the variable directly 
1

Если я правильно понял вопрос правильно ...

Если вы переопределение сеттер, вы хотите назначить _propertyName вместо self.propertyName, чтобы избежать бесконечной рекурсии:

- (void)setNote:(NSString *)note 
{ 
    _note = note; 
    // self.note = note; // <-- doing this instead would freeze, and possibly crash your app 
} 

То же самое и если вы переопределяете получателя. В других ситуациях вы можете использовать любой из двух.

+0

На самом деле 'self.note = note' не разбивает приложение - оно заворачивает его в бесконечный цикл вызова вызывающего абонента. –

+2

Вы правы, он сначала становится невосприимчивым к рекурсивным вызовам. Это может также привести к сбою в конце концов после исчерпания пространства памяти стека. Спасибо за исправление, я обновлю ответ. – Macondo2Seattle

+1

@rokjarc, нет, делая это внутри сеттера. Сбой вашего приложения из-за переполнения ** стека ** (соответственно достаточно.) Я делал это случайно несколько раз и могу с уверенностью сказать, что он потерпит крах. Это занимает меньше минуты. –