Я опытный программист на C/C++, начинающий изучать разработку Objective-C. В настоящее время я просматриваю образец UICatalog и сталкивался с другим примером идиомы. Я видел несколько мест и никогда не понимал.Нужна помощь в понимании конкретной идиотности alloc/release в программировании iOS/Objective-C
Код:
ButtonsViewController *buttonsViewController = [[ButtonsViewController alloc] initWithNibName:@"ButtonsViewController" bundle:nil];
[self.menuList addObject:[NSDictionary dictionaryWithObjectsAndKeys:
NSLocalizedString(@"ButtonsTitle", @""), kTitleKey,
NSLocalizedString(@"ButtonsExplain", @""), kExplainKey,
buttonsViewController, kViewControllerKey, nil]];
[buttonsViewController release];
AFAIK, это выделяет и инициализирует ButtonsViewController, создает NSDictionary для ButtonsViewController и добавляет словарь к NSMutableArray под названием menuList (который является переменным членом MainViewController где приведенным выше код живет), а затем выпускает только что созданный buttonViewController. Позже, MainViewController использует запись словаря для переключения представлений на buttonViewController, когда это необходимо.
Мой вопрос: почему buttonViewController все еще действует после этого кода? Он был выделен и выпущен без «сохранения» между ними. Добавляет ли что-то в NSDictionary или NSMutableArray неявное «сохранение»? Если это так, я должен был как-то это понять, или это просто одна из тех вещей, которые вы должны читать и помнить?
Я переключился на размышления о владельцах, а не именах методов. Если я непосредственно владею коллекцией, и она непосредственно владеет объектами, которые я вставляю в нее, я рассматриваю это как свое * косвенное * владение всеми объектами в коллекции, без * непосредственно * владеющих ими в одно и то же время. Мой аргумент в пользу этого - это еще одно, что нужно помнить, чтобы очистить; Я приветствую аргументы против. –
Я бы сказал, что эта модель становится более сложной из-за того, что нужно отслеживать, какие объекты фактически захватывают вещи, которые вы им передаете. Вещи, которые копируют свои аргументы, нет, слабые коллекции нет, делегаты не делают и т. Д. ... все это интуитивно для вас и для меня, но для обучения нового программиста какао много концепций. Модель локального * владения «я владею этим, пока я его использую» не требует мышления о других объектах. –
Более кратко, косвенные модели владения способствуют сцеплению. –