Вот два фрагмента кода Objective-C в приложении Foundation. Этот кусок кода в функции:-dealloc метод не вызывается, когда владелец массива dealloc'd ... не так ли?
[arrayOfObjects addObject:[[TheShape alloc] init]];
NSLog(@"%@", arrayOfObjects); // log verifies "<TheShape..." is in the array
[arrayOfObjects release];
и в моем классе TheShape, у меня есть этот метод dealloc
переопределения:
- (void)dealloc {
NSLog(@"TheShape dealloc called.");
[super dealloc];
}
Хотя моя программа работает иначе, он не работает так, как я ожидайте этого. Когда отправляется сообщение [arrayOfObjects release]
, я ожидаю увидеть строку «TheShape dealloc ...» в журнале. Это не так.
Q1: Почему бы и нет?
Так что я копаю немного и упрощаю вещи. Если я сделаю что-то более простое:
TheShape *aShape = [[TheShape alloc] init];
[aShape release];
Отладочное сообщение по-прежнему не отображается в журнале.
Q2: Почему бы и нет?
Но если я это сделать:
TheShape *aShape = [TheShape new];
[aShape release];
сообщение отладки делает появится в журнале. Отладочное сообщение также появляется в журнале, если я изменил значение alloc/init в первом примере на new
.
Q3: Почему?
Очевидно, что в цикле alloc/init/release (Q's 1 и 2) отсутствует явная концептуальная схема и в предполагаемой эквивалентности new
и alloc/init
(Q3). Может ли кто-нибудь указать мне на учебник, который объясняет вещи немного больше для трудномысленного мышления, как я?
Спасибо,
Билл
Не должно быть разницы между 'TheShape * aShape = [[TheShape alloc] init];' и 'TheShape * aShape = [TheShape new];'. – Mahesh