[英]Object is deallocated - why? where?
好的,我花了最后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
的代碼塊the next two lines cause the problem
。 最初,我沒有創建另一個字符串,但是稍后嘗試解決該問題時將其添加。
如果我將這兩行注釋掉,一切正常。 如果我把它們放回去,我得到
- [CFString class]: message sent to deallocated instance 0xa1a9000
我要放入userdefaults的字符串有問題嗎? 該字符串相當大(約200,000個字符),但是我過去在用戶默認值中存儲了更長的字符串。
還值得注意的是,如果我卸載該應用程序,則一切正常。 但是,在隨后的運行中,問題就顯現出來了。
那么,如何以及為什么以及在哪里將字符串釋放呢? 我已明確添加了retain
-但這仍然無濟於事。 我想念什么?
編輯:剛意識到我忘了說錯誤是在線上拋出
[defs setObject:viewControllersList forKey:kViewControllersKey];
同樣,對於一般信息, searchResults
上的方法- (NSString *)xmlString
確實具有名稱的含義:使用來自該對象的信息創建XML字符串。
編輯2:我嘗試使用該字符串做其他事情-將其轉換為NSData
,使用zlib壓縮-但無論數據類型如何,都會釋放該特定對象。 它必須與字符串的大小有關嗎?
NSString *res = [[NSString stringWithFormat:@"%@",[searchResults xmlString]] retain];
自動釋放。 您無需在方法結束時將其釋放。 您正在過度釋放它。
此外,您無需保留[searchResults xmlString]
。 stringWithFormat
方法已經為您完成了。
祝好運!
好的,不確定到底是什么問題,但這是在searchResults
和/或xmlString
方法中的某個地方。 searchResults
對象最初是根據從服務器接收到的XML創建的(XML被解析為對象結構)。 調用xmlString
時,由於某種原因,我返回的字符串與原始XML不同(當然,我不是在談論格式)-200,000個字符長的字符串,在前500個字符之內,大約有200個字符差異。 我一直無法弄清楚為什么。 因此,我沒有從對象結構中重新創建xml,而是將原始XML存儲在該對象的字段中,並且在xmlString
時,僅返回了原始字符串。 現在一切正常。
謝謝大家在這一痛苦過程中的支持。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.