iPhone вылетает, когда я "правильно" отпускаю контроллеры push-представления - PullRequest
0 голосов
/ 05 августа 2009

У меня есть приложение, основанное на контроллере навигации, и я сталкиваюсь со странной проблемой, когда некоторые из моих нажатий контроллера представления вызывают сбои при "выталкивании" контроллера представления.

Я сузил его до строки кода, которая освобождает контроллер представления после помещения его в стек контроллера навигации.

Мой код выглядит так:

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, и экземпляр никогда не будет освобожден.

1 Ответ

0 голосов
/ 05 августа 2009

Это выпущено где-то еще. Если вы хотите увидеть, кто звонит, вы можете просто прервать выпуск звонков в класс. Другой вариант - распечатать трассировку стека в выпуске:

#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];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...