Использование свойства и синтеза дает вам новый метод. В этом случае у вас будет новый метод set и get для detailedResultsTableViewController
. Это генерируется для вас, когда вы компилируете (т.е. нет кода, который вы должны добавить)
Этот установленный метод будет
- (void)setDetailedResultsTableViewController:(DetailedResultsTableViewController *)c
{
if (detailedResultsTableViewController != nil)
{
[detailedResultsTableViewController release];
detailedResultsTableViewController = nil;
}
detailedResultsTableViewController = [c retain];
}
Итак, когда вы звоните
self.detailedResultsMapViewController = [[DetailedResultsMapViewController alloc] init...];
На самом деле вы звоните
[self setDetailedResultsMapViewController:[[DetailedResultsMapViewControler...]]];
И поэтому вы на самом деле делаете два удержания. Тот, где вы вызываете alloc ... init. а затем другой, потому что вы неявно вызываете setDetailedResultsMapViewController, который затем также выполняет сохранение.
Если вы используете свойства, вы бы использовали
DetailedResultsTableViewController *d = [[DetailedResultsMapViewController alloc] init...]
self.detailedResultsMapViewController = d;
[d release];
Преимущество этого заключается в том, что вам не нужно помнить, чтобы освободить старый объект, прежде чем назначить новый, поскольку синтезированный метод сделает это за вас. Вы также можете просто сделать
self.detailedResultsMapViewController = nil;
в вашем методе dealloc, и вам не придется беспокоиться, если вы уже выпустили его в другом месте.
Это полезно знать, потому что вы можете переопределить метод set, вручную введя код, который позволяет вам что-то делать, когда объекты установлены.