Можно создать дубликат:
check retain countПроблема с хранением/выпуском. Разъяснение необходимости
Как я играл с retain
, release
подсчетов, я столкнулся с ситуацией, я не могу объяснить. Пожалуйста, помогите мне лучше понять:
- Существует класс
O
. Он не содержит переменных и ничего не делает. - Существует класс графа. Он инициализирует приращения
O
и декрементирует рассчитывает на это - Существует ПИ СИБ с 2-мя кнопками: Сохранить и отпустите
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
o = [[O alloc]init]; // At this moment [o retainCount] is 1 as expected
....
Для каждого doRetain, подсчитывает приращения, как и ожидалось
- (IBAction)doRetain:(id)sender {
[o retain];
NSString *result = [[NSString alloc] initWithFormat:@"%d", [o retainCount]];
[label setText: result];
[result release];
}
Всякий раз, когда вызывается освобождение, количество уменьшается
- (IBAction)doRelease:(id)sender {
[o release];
NSString *result = [[NSString alloc] initWithFormat:@"%d", [o retainCount]];
[label setText: result];
[result release];
}
Рассмотрим 1 сохраняет и 2-релизы
- Мы начнем с сохранением графом 1, после последовательности Alloc инициализации
- следует инструкции сохранить счетчик доходит до 2
- Затем мы уменьшаем количество, и оно уменьшается до 1
- После h следующее уменьшение ..... похоже, ничего не делает Сохранение счета еще 1
- Этот выпуск относится к плохой памяти и приводит к сбою приложения.
Пожалуйста, помогите мне понять это поведение
Это имеет смысл. Спасибо Дагу – JAM