iPhone выходит из строя, когда я “правильно” отпускаю нажатые контроллеры просмотра
-
22-07-2019 - |
Вопрос
У меня есть приложение на основе навигационного контроллера, и я сталкиваюсь со странной проблемой, когда несколько нажатий моего контроллера просмотра вызывают сбои при "выскакивании" контроллера просмотра.
Я сузил поиск до строки кода, которая освобождает контроллер просмотра после помещения его в стек контроллера навигации.
Мой код выглядит примерно так:
SomeViewController *viewController = [[SomeViewController alloc] init];
[self.navigationController pushViewController:viewController animated:YES];
[viewController release]; //offending line
Теперь это является правильный код управления памятью, но, к сожалению, я получаю ошибку "double free отправлено экземпляру 0x ....." (в некоторых случаях), и мое приложение выходит из строя.Обычно это происходит, когда я открываю указанный контроллер просмотра.
Я ищу предложения о том, на что обратить внимание.Я застрял.
Заранее благодарю.
Редактировать:вот результат дампа трассировки стека, предложенный Луисом ниже.
после первого выпуска количество сохранений равно 13 (я думаю, из-за некоторого кода глубоко в базовых классах CocoaTouch).В конце концов все сводится к этому:
#2009-08-06 22:33:18.304 My App [26601:20b] ** RELEASE CALLED ** 2009-08-06 22:33:18.306 My App [26601:20b] Retain count was : 1 0 My App 0x000033ec start + 4700 1 CoreFoundation 0x302042e8 CFRelease + 136 2 CoreFoundation 0x30227249 CFNumberGetValue + 2937 3 CoreFoundation 0x30204421 _CFRelease + 241 4 Foundation 0x30506515 NSPopAutoreleasePool + 341 5 QuartzCore 0x00b5436e CA_CGRectUnapplyInverseTransform_ + 19738 6 QuartzCore 0x00b54109 CA_CGRectUnapplyInverseTransform_ + 19125 7 CoreFoundation 0x302454a0 CFRunLoopRunSpecific + 3696 8 CoreFoundation 0x30244628 CFRunLoopRunInMode + 88 9 GraphicsServices 0x32044c31 GSEventRunModal + 217 10 GraphicsServices 0x32044cf6 GSEventRun + 115 11 UIKit 0x309021ee UIApplicationMain + 1157 12 My App 0x00002258 start + 200 13 My App 0x000021c6 start + 54 14 ??? 0x00000001 0x0 + 1 2009-08-06 22:33:18.307 My App [26601:20b] ########### DEALLOC
objc[26601]: FREED(id): message retainCount sent to freed
объект=0xd09070
Если я опущу оскорбительную строку выше ([ViewController release];), то количество сохранений будет равно только 2, и экземпляр никогда не будет освобожден.
Решение
Он выпускается где-то в другом месте.Если вы хотите увидеть, кто это вызывает, вы можете просто прервать вызовы release для класса.Другим вариантом было бы распечатать трассировку стека в release:
#include <execinfo.h>
#include <stdio.h>
- (void) release {
void* callstack[128];
int i, frames = backtrace(callstack, 128);
char** strs = backtrace_symbols(callstack, frames);
for (i = 0; i < frames; ++i) {
printf("%s\n", strs[i]);
}
free(strs);
[super release];
}