好的,我花了最後的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 *)xmlString
上searchResults
:將創建一個XML字符串來自該對象的信息。
編輯2:我嘗試做別的事情與字符串 - 將其轉換爲NSData
,使用zlib的壓縮 - 但不論數據類型,特定對象被釋放。它是否需要對字符串的大小做些什麼?
我懷疑它是'[searchResults xmlString]'這就是問題所在,但是這不會出現在代碼中的任何地方。你能告訴我們其他使用它的代碼嗎? – Louis 2012-01-04 21:10:50
@Louis:我用一些附加信息更新了這個問題 – 2012-01-04 21:17:57
如何定義'kViewControllersKey'? – Joe 2012-01-04 21:22:59