bar = self.foo;
- это просто сокращенная запись для
bar = [self foo];
, а
self.foo = bar;
- сокращение для
[self setFoo:bar];
С точки зрения управления памятью это просто означает, что определенные установщики и получатели вызываются , тогда как
foo = bar
просто присвоит значение (т. е. в основном просто скопирует указатель).
Скажем, у вас естьсохраненное свойство
@property (nonatomic, retain) FooType *foo;
//...
@synthesize foo;
, тогда установщик может выглядеть следующим образом:
- (void) setFoo:(FooType*)x
{
[x retain];
[foo release];
foo = x;
}
Теперь, если вы сделаете
FooType *newFoo = [[FooType alloc] init];
[self setFoo:newFoo];
// or self.foo = newFoo
Все будет в порядке, поскольку ваш ранее выделенный объектосвобождается и новый объект сохраняется правильно.Если бы вы вместо этого просто сделали
foo = newFoo;
, не думая о том, чтобы освободить старый и сохранить новый объект, вы бы потеряли память или еще хуже ...