В первом синтаксисе:
self.effortView = [[EffortView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)];
self.effortView.effortTableView = [[UITableView alloc]initWithFrame:CGRectMake(25, 25, 300, 420) style:UITableViewStyleGrouped];
вы получаете доступ к обоим иварам через их методы доступа (обычно, effortView
для получения, setEffortView
для установки).
Во втором синтаксисе:
effortView = [[EffortView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)];
effortView.effortTableView = [[UITableView alloc]initWithFrame:CGRectMake(25, 25, 300, 420) style:UITableViewStyleGrouped];
вы получаете доступ к effortView
ivar напрямую (назначение указателя), в то время как вы обращаетесь к effortTableView
через средство доступа к свойству.
Разница в том, что используя аксессор, вы получаете дополнительное поведение. Например, стандартные аксессоры set
, сгенерированные ключевым словом @synthesize
для свойства retain
:
@property (nonatomic, retain) NSObject* property;
вы получаете автоматическое управление счетом удержания (то есть, счет удержания будет автоматически увеличиваться на назначенном объекте; если у ивара уже было значение, у объекта, на который указывает указатель, счет удержания будет уменьшен). Это означает, что в первом примере вы вызываете 2 утечки памяти. Действительно, (если свойства объявлены как retain
свойство), присвоение им увеличит их количество сохраняемых данных; но [[alloc] init]
уже возвращает объект с счетом сохранения 1, поэтому вам не нужно увеличивать его еще раз. Правильно будет:
self.effortView = [[[EffortView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)] autorelease];
self.effortView.effortTableView = [[[UITableView alloc]initWithFrame:CGRectMake(25, 25, 300, 420) style:UITableViewStyleGrouped] autorelease];
В целом, свойства значительно облегчают работу с системой управления счетом и предлагают рекомендуемый способ ее использования, но вы должны знать об их семантике "счетчик записей" и учитывать это.
Я бы предложил эту статью в качестве интересного прочтения.