2012-07-07 47 views
0

我目前正在爲iPhone開發我的第一個應用程序,我已經差不多完成了,但我遇到了內存管理等問題。請記住,我對Java很好,我只學習了Objective C約4天。Objective 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

它看起來像在userText的實例不再你身邊,你可以顯示如該被初始化,以及它是如何在這個代碼的其他地方處理? – 2012-07-07 16:41:04

回答

1

userText變量是不是有效的對象,這是你的錯誤消息表示。通常,當您嘗試使用指向不再存在的指針時,EXC_BAD_ACCESS會發生。然後啓用殭屍,消息更加清晰,userText曾經是一個字符串,但已被釋放。

編輯:

如果userText是一個實例變量,建議使用屬性,然後點表示法。某處有一個@interface部分,其中聲明瞭userText。它應該這個樣子:

@property (nonatomic, strong) NSString *userText; 

然後在@implementaiton區域,像這樣:

@synthesize userText = _userText; 

這些,在一起,使點符號可用,那麼你應該使用 self.userText訪問它到處(除定製存取):

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

然後我如何重新分配它? – HDAViiRuS 2012-07-07 16:47:58

+0

你不重新分配它們,你用「強」(擁有)引用保留它們。 – 2012-07-07 16:51:50

+0

@ranReloaded你能指定我怎麼做,謝謝! – HDAViiRuS 2012-07-07 16:54:47

1

您正在使用ARC,因此您將無法釋放對象,但是如果您想釋放它們,則可以將它們設置爲零。

相反,您可以使用不需要保留的變量,也可以對那些想要保留的變量使用較強的修飾符。

如果您只是在學習obj-c,我會強烈建議禁用ARC,以便全面瞭解objective-c的工作方式以及爲什麼ARC現在是來自Apple的建議。

+0

謝謝!但是你知道我的問題的解決方案嗎? – HDAViiRuS 2012-07-07 16:50:14

+1

我確實在你的頭文件中使用了一個屬性,用強限定符來解決你的問題。 – 2012-07-07 16:54:51

0

解決這類問題的常用方法是啓用NSZombies。當您以比友善的方式發送消息到釋放對象時,這會標記出來,而不是拋出此異常。

此外,由於這些調用是編譯器在構建時添加的,所以還不能使用retainreleaseautorelease

有一些奇怪的建設與要創建的randuser NSString的方式,但不知道什麼randNumberSuserText是我不能幫助更多。

最後,由於您是Cocoa和Objective-C的新成員,有Apple的Coding Style Guide,我寫了一個coding conventions指南。

編寫Cocoa時有一些約定,使其他開發人員更容易閱讀您的代碼。

+0

@Abizem謝謝,我會考慮兩個! – HDAViiRuS 2012-07-07 17:09:55

1

在儀器下的模擬器上運行您的應用程序(使用Xcode的Product> Profile菜單項)。選擇殭屍工具。當樂器由於殭屍參考而停止您的應用程序時,您可以在詳細信息面板(「樂器」窗口的底部)中深入查看殭屍對象上的保留和釋放歷史記錄。您可以通過打開擴展詳細信息面板(「儀器」窗口的右側)來查看每個保留和釋放的堆棧跟蹤。

這應該可以幫助你追蹤爲什麼你的殭屍對象在你預期之前被釋放。

鏈接與其他指導:

http://www.markj.net/iphone-memory-debug-nszombie/

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