2010-12-05 6 views
5

나는 여기 뉴비입니다. 나는 퀴즈 응용 프로그램을 만들려고 노력하고 있는데 내 응용 프로그램은 퀴즈의 첫 번째 반복을 위해 정상적으로 실행되지만 두 번째 실행에서는 콘솔 오류없이 종료됩니다. 아래의 모든 코드를 참조 용으로 작성하십시오.콘솔 오류나 충돌 로그없이 아이폰 앱이 다운됩니다 :

다음과 같이 퀴즈를 다시 실행하면 아래의 - (void) loadNextWord 함수가 실행되지만 그 이후에는 아무 일도 일어나지 않는 것 같습니다.

도와주세요!

감사합니다. 디버거에서

덤프 :

메인 FUNC 내에서 라인 (14) INT RETVAL = UIApplicationMain (는 argc, argv를, 무, 무)이고; 당신이 라인

[NSAutoreleasePool release] 

이 너무 여러 번 같은 즉, 객체 출시했다고 하더군요 참조 스택 추적을 보면

#import <UIKit/UIKit.h> 

int main(int argc, char *argv[]) { 

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
int retVal = UIApplicationMain(argc, argv, nil, nil); 
[pool release]; 
return retVal; 
} 

Program received signal: “EXC_BAD_ACCESS”. 
(gdb) 
#0 0x025f0907 in objc_msgSend() 
#1 0x05f28da0 in ??() 
#2 0x023cfc9d in _CFAutoreleasePoolPop() 
#3 0x0001ee67 in -[NSAutoreleasePool release]() 
#4 0x002cfe7f in _UIApplicationHandleEvent() 
#5 0x02d73822 in PurpleEventCallback() 
#6 0x02474ff4 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__() 
#7 0x023d5807 in __CFRunLoopDoSource1() 
#8 0x023d2a93 in __CFRunLoopRun() 
#9 0x023d2350 in CFRunLoopRunSpecific() 
#10 0x023d2271 in CFRunLoopRunInMode() 
#11 0x02d7200c in GSEventRunModal() 
#12 0x02d720d1 in GSEventRun() 
#13 0x002d3af2 in UIApplicationMain() 
#14 0x00002880 in main (argc=1, argv=0xbfffef94) at /Users/vbhardwaj/Documents/ObjectiveC/FinalProject/FunWords/main.m:14 
+2

거기에'dealloc'의 철자가 틀린 것 같습니다 ... –

+0

안녕하세요 제이콥 - 코드에 고정되어 있으며 형식이 잘못되었습니다. 그게 문제가되지 않는 것 같습니다. . . –

+0

디버그 모드로 실행 해 보셨습니까? 디버그 구성 **을 선택하고 ** 디버거가 연결된 상태에서 시작하십시오. 콘솔은 올바른 힌트를 주거나 올바른 라인에서 즉시 정지해야합니다. – Eiko

답변

8

:

NSString *string = [NSString stringWithString:@"Hello"]; // This string is autoreleased 
[string release]; // This line won't crash but is WRONG! 

위의 코드를 것입니다 즉시 충돌하지는 않지만 문자열은 해제되고 dealloc됩니다. 그러나 autorelease도 있기 때문에 autorelease 풀은 어느 시점에서 다시 풀어 놓으려고합니다. 랜덤 충돌이 언제 발생하는지 알 수 없습니다.

당신은 아마 :) 그런 짓을 한

+0

딘 감사합니다! 그것은 정말로 문제였습니다.로컬/임시 변수 메모리 관리를 초기화시 autorelease (자신을 해제하려고 시도하는 대신)로 변경하여 문제가 해결 된 것으로 보입니다. –

+0

아 ... 많은 충돌 보고서가 갑자기 의미가 있습니다. 나는 그런 멍청하다. :) –

0

문제는 여러 릴리스입니다.

코드를 올바르게 디버깅 할 수 있도록 포함 파일도 포함됩니다. wordImageView를 코드에서 릴리스한다는 것을 알 수 있습니다. 그렇게해서는 안됩니다. 당신이해야 할 것은

self.wordImageView = nextImageView; 
[nextImageView release]; 

대신

[wordImageView release]; // release the flagView's memory 
wordImageView = nextImageView; // reassign flagView to the new view 

당신은 항상 너무 오토 릴리즈 풀을 사용할 수 같은 것을 특성을 활용하고하는 것입니다, 그러나 이것은 메모리 페널티 문제와 함께 제공됩니다.

Btw는 문제가 메인 루프에있는 것처럼 보이지만 거기에 없습니다. 이것은 autorelease pool이 정리 된 위치 일 뿐이며 문제가 나타납니다.

어쨌든 코드를 살펴보고 모든 'alloc'이 동일한 선택기 내에서 동일한 객체의 'release'에 의해 처리되는지 확인하십시오.

+0

Panaytois 고마워요! –

관련 문제