문제

내비게이션 컨트롤러 기반 애플리케이션이 있으며, View Controller Pushes 중 일부가 뷰 컨트롤러를 "팝핑"할 때 충돌이 발생하는 이상한 문제가 발생합니다.

Navigation Controller의 스택에서 푸시 컨트롤러를 릴리스하는 코드 라인으로 좁혔습니다.

내 코드는 다음과 같습니다.

SomeViewController *viewController = [[SomeViewController alloc] init];
[self.navigationController pushViewController:viewController animated:YES];
[viewController release];  //offending line

이제 이것은 ~이다 적절한 메모리 관리 코드이지만 불행히도 "INSTIA 0X ....."오류 (경우에 따라) 및 앱이 충돌하는 "Double Free가 전송됩니다. 이것은 일반적으로 내가 뷰 컨트롤러를 팝하면 발생합니다.

나는 무엇을 봐야할지에 대한 제안을 찾고있다. 나는 붙어있다.

미리 감사드립니다.

편집하다: 아래의 루이가 제안한 스택 트레이스 덤프의 결과는 다음과 같습니다.

첫 번째 릴리스시, Retain Count는 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로 만 만들고 인스턴스는 절대 거래되지 않습니다.

도움이 되었습니까?

해결책

다른 곳에서 출시되고 있습니다. 누가 그것을 부르는지보고 싶다면 수업에 대한 릴리스 전화를 끊을 수 있습니다. 또 다른 옵션은 릴리스에서 스택 추적을 인쇄하는 것입니다.

#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];
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top