2012-04-17 43 views
2

我運行一個後臺線程來從Web服務獲取數據。的iOS5 BAD_EXCESS僅在設備

獲取所需用於創建網址我使用這個方法的設置:

+(Settings *)getSettings 
{ 
    Settings *settings = [[Settings alloc] init]; 
    NSString *path = [NSString stringWithFormat:@"Documents/Settings"]; 
    NSString *settingsPath = [NSHomeDirectory() stringByAppendingPathComponent:path]; 
    NSFileManager *fileMgr = [NSFileManager defaultManager]; 
    if ([fileMgr fileExistsAtPath:settingsPath]) { 
     NSDictionary *settingsDictionary = [NSDictionary dictionaryWithContentsOfFile:settingsPath]; 
     settings.username = [settingsDictionary objectForKey:@"username"]; 
     settings.module = [settingsDictionary objectForKey:@"module"]; 
     settings.websiteUrl = [settingsDictionary objectForKey:@"websiteUrl"]; 

    }else 
    { 
     settings.username = @""; 
     settings.module = @""; 
     settings.websiteUrl = @""; 
    } 
    NSLog(@"Settings = u:%@ m:%@ w:%@",settings.username,settings.module,settings.websiteUrl); 
    return settings; 
} 

這個工程在調試器正常,但當我在設備上運行它,我得到BAD_EXCESS上的NSLog或任何類別試圖與警告使用數據:

警告:試圖創建與塊不是在幀USE_BLOCK_IN_FRAME變量。

這是代碼在設備上工作的罰款,如果我通過代碼。

任何想法?

編輯: 回溯 -

#0 0x37a97eda in objc_retain() 
#1 0x37aa4be4 in objc_retainAutoreleasedReturnValue() 
#2 0x0000f84a in +[SettingData getSettings] (self=0x175e4, _cmd=0x11af9) at /Users/Jono/Dropbox/Uni/iOS5/Feedback At Tees/Feedback At Tees/SettingData.m:49 
#3 0x0000fa86 in -[DataManager init] (self=0x3509e0, _cmd=0x30fd9f96) at /Users/Jono/Dropbox/Uni/iOS5/Feedback At Tees/Feedback At Tees/DataManager.m:19 
#4 0x00003b46 in __35-[MasterViewController viewDidLoad]_block_invoke_0 (.block_descriptor=0x185f40) at /Users/Jono/Dropbox/Uni/iOS5/Feedback At Tees/Feedback At Tees/MasterViewController.m:70 
#5 0x30b08d54 in _dispatch_call_block_and_release() 
#6 0x30b0b896 in _dispatch_worker_thread2() 
#7 0x37a0e1ce in _pthread_wqthread() 
#8 0x37a0e0a4 in start_wqthread() 

我試圖加入以下的設置init方法,如果我步驟通過它是確定如果我不崩潰在第二NSLog的與所述錯誤:消息發送以釋放實例0x160d60

-(id)init 
{ 
    if ((self=[super init])) 
    { 
     NSString *path = [NSString stringWithFormat:@"Documents/Settings"]; 
     NSString *settingsPath = [NSHomeDirectory() stringByAppendingPathComponent:path]; 
     NSFileManager *fileMgr = [NSFileManager defaultManager]; 
     if ([fileMgr fileExistsAtPath:settingsPath]) 
     { 
      NSDictionary *settingsDictionary = [NSDictionary dictionaryWithContentsOfFile:settingsPath]; 
      self.username = [settingsDictionary objectForKey:@"username"]; 
      self.module = [settingsDictionary objectForKey:@"module"]; 
      self.websiteUrl = [settingsDictionary objectForKey:@"websiteUrl"]; 
      NSLog(@"Settings = u:%@ m:%@ w:%@",self.username,self.module,self.websiteUrl); 
     } 
     else 
     { 
      self.username = @""; 
      self.module = @""; 
      self.websiteUrl = @""; 
     } 
    } 
    NSLog(@"Settings = u:%@ m:%@ w:%@",self.username,self.module,self.websiteUrl); 
    return self; 
} 

截圖: http://postimage.org/image/4vw6uq7pp/

+2

BAD_EXCESS或EXC_BAD_ACCESS? – 2012-04-17 16:12:41

+0

只是檢查是EXC_BAD_ACCESS – Jonoh89 2012-04-17 16:25:41

+0

具有運行分析? – 2012-04-17 16:27:50

回答

2

首先,T他的方法應該是retrieveSettingsdownloadSettings或者,只是,settings,但不作爲getSettingsget前綴有關於方法的論證一個非常特殊的意義(按引用傳遞)。

其次,代碼 settings的泄漏除外,但不會導致此類崩潰) 沒有任何明顯錯誤。 (我看到ARC已啓用)。

最後,如果你有崩潰然後發佈回溯。您看到的錯誤消息(「USE_BLOCK_IN_FRAME」)表示您發佈的代碼與崩潰無關。


奇崩潰,這一點。好的 - 警告來自調試器,並且與實際的錯誤沒有任何關係。

範圍邊界常常是在編譯器將發出release和/或漏極自動釋放池。

這就引出了下一個問題;如何

This is the code works fine on the device if I step through the code.

好的 - 所以,它不工作時,你全速運行,並在逐步運行時工作。聞起來像一個併發崩潰。你能發佈實際崩潰的截圖嗎?即你確定特定的回溯是崩潰的回溯,而不是調試器發生崩潰時的情況嗎?

(是的,輕輕地抓住吸管 - 這次碰撞對於顯示的證據沒有意義,我喜歡謎題。)


好的 - 現在我們正在某個地方。有點。它崩潰如果範圍成功登錄後同樣的東西裏面如果範圍。

username,modulewebsiteURL如何定義?他們是strong還是最合適的copy@property聲明?

+0

添加了我認爲是我的主要問題的回溯 – Jonoh89 2012-04-17 17:03:28

+0

問題似乎是,無論我在哪裏實例化設置或嘗試在上面的方法中設置值,它都會被釋放,但是當我放入一條評論時,我是使用ARC。我使用NSZombieEnabled並獲取[CFString retain]:在嘗試使用設置中的值的任何地方發送消息到釋放的實例。 – Jonoh89 2012-04-17 19:17:27

+0

首先,重命名該方法,因爲這很麻煩。其次,顯示調用'settings'方法的東西。最後,張貼截圖 - 很難想象如何粘貼回溯可能是崩潰的來源。 – bbum 2012-04-17 19:19:06

0

當我看到EXC_BAD_ACCESS我認爲這是一次使用NSZombieEnabled(或殭屍特徵的儀器,如果你可以重新產生它的模擬器。

This thread對如何完成任務的說明。