У меня есть приложение, основанное на контроллере навигации, и я сталкиваюсь со странной проблемой, когда некоторые из моих нажатий контроллера представления вызывают сбои при "выталкивании" контроллера представления.
Я сузил его до строки кода, которая освобождает контроллер представления после помещения его в стек контроллера навигации.
Мой код выглядит так:
SomeViewController *viewController = [[SomeViewController alloc] init];
[self.navigationController pushViewController:viewController animated:YES];
[viewController release]; //offending line
Теперь этот является правильным кодом управления памятью, но, к сожалению, я получаю сообщение об ошибке "double free sent to instance 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, и экземпляр никогда не будет освобожден.