2012-07-07 4 views
0

저는 현재 iPhone을위한 첫 번째 앱을 만들고 있습니다. 거의 완료되었지만 메모리 관리 등에 문제가 있습니다. 나는 자바에 능숙하며 약 4 일 동안 Objective C만을 배우고 있다는 것을 명심하라.객관적인 C 메모리 문제

따라서 정확한 문제는이 영역에 있습니다 (별표 줄 사이). 참고 : 모든 코드는 큰 게임 루프 안에 있습니다.

else 
     { 
      *********************************** 
      NSString *rand = [NSString stringWithFormat:@"%@", randNumberS]; 
      while(lastTime + interval >= currentTime) 
      { 
     !!!!!!!!!NSString *user = [NSString stringWithFormat:@"%@", userText]; 
        if([user isEqualToString: rand]) 
        { 
      *********************************** 
         score += 10; 
         randNumberS = nil; 
         timeToGenerateNum = true; 
         bottomClear = true; 
         break; 
        } 
        else 
        { 

         //NSLog(@"%@ != %@, %i", userText, randNumberS, score); 
        } 

      } 
      NSLog(@"Game Over! Your score was %i!", score); 
     } 
    } 

나는 좀비 활성화하기 전에 내가 달릴 때마다 (참고 : 코드는 BTW 몇 초 동안 실행)은 "!", 나는 표시 줄에서 Thread 6: Program received signal: "EXC_BAD_ACCESS"을 얻었다. 좀비를 사용하도록 설정하면 몇 초 동안 실행 된 다음 작동이 멈추고 -[CFString respondsToSelector:]: message sent to deallocated instance 0x11168440 메시지가 콘솔에 표시됩니다. 또한 "!"기호를 사용하여 같은 줄에 플래그를 지정합니다.

나는이 둘을 모두 보았고 둘 다 열악한 메모리 관리를 가리키고 있지만 NSString 객체를 릴리스하려고 시도했지만 내 프로그램에서 객체를 릴리스하지 못하게했습니다. (참고 :이 오류 메시지는 "release" is unavailable: not available in automatic reference counting mode입니다.)

도움을 주시면 감사하겠습니다.

편집 :

userText는하지만 대부분이 하나, 방법의 다양한 숫자에 사용됩니다.

-(IBAction)button1Clicked:(id)sender 
{  
if(userText == nil) 
{ 
    userText = [NSString stringWithFormat:@"%i", 1]; 
} 
else 
{ 
    userText = [NSString stringWithFormat:@"%@%i",userText , 1]; 
} 
bottomLabel.text = userText; 
NSLog(@"Test 1"); 
} 
+0

는 초기화됩니다 위치를 표시 할 수 있습니다, 주변에 더 이상 없다, 그것은이 코드의 다른 곳에서 처리 어떻게 ? –

답변

1

userText 변수는 오류 메시지가 표시 무엇 유효한 개체가 아닙니다. 일반적으로 EXC_BAD_ACCESS는 더 이상 존재하지 않는 포인터를 가리키는 포인터를 사용하려고 할 때 발생합니다. 그런 다음 좀비가 활성화 된 상태에서 메시지는 더욱 분명 해지고 userText은 문자열로 사용되었지만 할당이 취소되었습니다.

편집 :

userText는 인스턴스 변수 인 경우,이 속성을 사용하는 것이 좋습니다 다음 점 표기법입니다. 어딘가에 userText가 선언 된 @interface 섹션이 있습니다.

@synthesize userText = _userText; 

이 함께, 도트 표기법을 사용할 수 있도록, 그리고 당신은 사용해야이 같은 @implementaiton 지역에서 그런

@property (nonatomic, strong) NSString *userText; 

, 뭔가를 : 그것은 다음과 같아야합니다 액세스 할 self.userText 도처 (맞춤 접근 자 제외) :

self.userText = @"something"; 
NSString *something = self.userText; 
+0

그럼 어떻게 다시 할당합니까? – HDAViiRuS

+0

당신은 그들을 재할 당하지 않고, 당신은 '강한'(소유하고있는) 참조로 주변을 지키고 있습니다. –

+0

@ranReloaded 어떻게 그렇게 할 것인지 지정해 주시겠습니까? 감사합니다. – HDAViiRuS

1

ARC를 사용하고 있으므로 개체를 해제 할 수 없지만 개체를 ​​해제하려면 해당 개체를 nil로 설정할 수 있습니다.

대신에 약자를 사용하지 않아도되는 약병을 사용하거나 약자를 유지하려는 약자를 사용할 수 있습니다.

obj-c를 배우는 경우 ARC를 사용하지 않는 것이 좋습니다. 그러면 objective-c가 작동하는 방식과 ARC가 현재 Apple에서 권장하는 이유를 완전히 이해할 수 있습니다.

+0

감사합니다. 하지만 내 문제에 대한 해결책을 알고 있니? – HDAViiRuS

+1

강력한 한정자를 사용하여 헤더에 usertext 속성을 만들면 문제가 해결됩니다. –

0

이러한 종류의 문제를 해결하는 일반적인 방법은 NSZombies를 사용하는 것입니다.할당 해제 된 객체에이 예외를 throw하는 것보다 친숙한 방식으로 메시지를 보낼 때 플래그가 올라갑니다.

또한 ARC를 사용하면 컴파일시 컴파일러에서 추가하기 때문에 retain, release 또는 autorelease을 사용할 수 없습니다.

,하지만 randNumberSuserText 내가 훨씬 더 도움이되지 수 있습니다 모르고 당신이 randuser NSStrings를 작성하는 방법 몇 가지 이상한 구조물이 있습니다.

마지막으로, 귀하는 Cocoa 및 Objective-C에 익숙하지 않으므로, Apple이 Coding Style Guide을 가지고 있으며 coding conventions 가이드를 썼습니다.

다른 개발자가 코드를 더 쉽게 읽을 수 있도록 코코아를 작성할 때 규칙이 있습니다.

+0

@Abizem 고마워, 나는 둘 다 살펴볼 것이다! – HDAViiRuS

1

시뮬레이터에서 Instruments 아래의 앱을 실행하십시오 (Xcode의 제품> 프로필 메뉴 항목 사용). 좀비 도구를 선택하십시오. 인스트루먼트가 좀비 참조로 인해 앱을 중지하면 세부 정보 패널 (인스트루먼트 창 하단)을 드릴 다운하여 좀비 오브젝트의 유지 및 릴리스 내역을 확인할 수 있습니다. 확장 된 세부 정보 패널 (Instruments 윈도우의 오른쪽)을 열어 각 유지 및 해제에 대한 스택 추적을 볼 수 있습니다.

이렇게하면 좀비 오브젝트가 예상보다 먼저 해제되는 이유를 추적하는 데 도움이됩니다. 추가 지침에

링크 :

http://www.markj.net/iphone-memory-debug-nszombie/ 그것은 userText의 예처럼 보이는

http://www.dimzzy.com/blog/2011/02/hunting-down-zombies-in-ios-apps/