2012-01-04 168 views
1

好的,我花了最後的8個小時與它戰鬥 - 它似乎超出了我。這裏是我完整的(相關)代碼:對象被釋放 - 爲什麼?哪裏?

- (void)updateUserDefaults 
{ 
    NSMutableDictionary *viewControllerDetails = [[NSMutableDictionary alloc] initWithCapacity:4]; 

    [viewControllerDetails setObject:[NSNumber numberWithInt:OOVenueClassControllerType] forKey:@"classType"]; 
    [viewControllerDetails setObject:self.searchTerm forKey:@"searchTerm"]; 
    [viewControllerDetails setObject:self.searchLocation forKey:@"searchLocation"]; 

    //----- the next two lines cause the problem 
    NSString *res = [[NSString stringWithFormat:@"%@",[searchResults xmlString]] retain]; 
    [viewControllerDetails setObject:res forKey:@"searchresults"]; 
    //----- 

    NSMutableArray *viewControllersList = [NSMutableArray array] ; 
    [viewControllersList addObject:viewControllerDetails]; 

    NSUserDefaults *defs = [NSUserDefaults standardUserDefaults]; 
    //the following line causes the error 
    [defs setObject:viewControllersList forKey:kViewControllersKey]; 
    [defs synchronize]; 

    [res release]; 
} 

注意與the next two lines cause the problem塊。起初,我沒有創建另一個字符串,但稍後在嘗試解決問題時添加了它。

如果我註釋掉這兩行,一切正常。如果我把它們放回去,我得到

- [CFString class]: message sent to deallocated instance 0xa1a9000 

是我想要放入userdefaults的字符串有問題嗎?該字符串相當大(大約200,000個字符),但過去在用戶默認情況下存儲的字符串甚至更長。

還值得注意的是,如果我卸載應用程序,那麼一切工作正常。但在隨後的運行中,問題展現出來。

那麼,如何以及爲什麼以及在哪裏取得字符串?我已明確添加retain - 但這仍然沒有幫助。我錯過了什麼?

編輯:剛剛意識到我忘了說,錯誤是上線不正是這個名字的意思拋出

[defs setObject:viewControllersList forKey:kViewControllersKey]; 

此外,對於一般的信息,方法- (NSString *)xmlStringsearchResults:將創建一個XML字符串來自該對象的信息。

編輯2:我嘗試做別的事情與字符串 - 將其轉換爲NSData,使用zlib的壓縮 - 但不論數據類型,特定對象被釋放。它是否需要對字符串的大小做些什麼?

+0

我懷疑它是'[searchResults xmlString]'這就是問題所在,但是這不會出現在代碼中的任何地方。你能告訴我們其他使用它的代碼嗎? – Louis 2012-01-04 21:10:50

+0

@Louis:我用一些附加信息更新了這個問題 – 2012-01-04 21:17:57

+1

如何定義'kViewControllersKey'? – Joe 2012-01-04 21:22:59

回答

0

好吧,不知道究竟是什麼問題,但它在searchResults和/或xmlString方法的某處。 searchResults對象最初是根據從服務器接收到的XML創建的(XML被解析爲對象結構)。當調用xmlString時,出於某種原因,我回來的字符串與原始XML不同(當然,我不是在談論格式化) - 在前500個字符內有200,000個字符長的字符串,所以有一些差異。我一直無法弄清楚爲什麼。因此,我不是從對象結構中重新創建xml,而是將原始XML存儲在該對象的字段中,並且在調用xmlString時簡單地返回原始字符串。現在一切正常。

謝謝大家對這個痛苦的過程給予的支持。

1
NSString *res = [[NSString stringWithFormat:@"%@",[searchResults xmlString]] retain]; 

自動發佈。您不需要在方法結束時發佈它。你過度釋放它。此外,您不需要保留[searchResults xmlString]stringWithFormat方法已經爲你做。

祝你好運!

+0

感謝您的評論,但它絕對不是問題,因爲執行永遠不會到達那條線。這個錯誤在''[defs setObject:viewControllersList forKey:kViewControllersKey]'行被拋出。 ' – 2012-01-04 21:14:07

+0

'res'被保留並隨後被釋放,所以它不會過度釋放,在這種情況下它是沒有必要的。 – tia 2012-01-05 02:55:46

+0

@tia,很好的接收 – timthetoolman 2012-01-07 17:33:14