2010-07-26 74 views
0

我檢查過使用儀器,沒有發現任何內存泄漏。 當我檢查設備它顯示內存泄漏與負責任的調用者 - [NSKeyedUnarchiver decodeObjectForKey:]和對象是UIRoundedRectButton。設備中的內存泄漏不在模擬器中

我還沒有使用NSKeyedUnarchiver或任何類型的解碼。是下面的代碼,是負責這個內存泄漏?

- (void)saveToFile:(NSString *)pinStr 
{ 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectoryPath = [paths objectAtIndex:0]; 
NSString *path = [documentsDirectoryPath stringByAppendingPathComponent:@"smsbrain.plist"]; 

NSMutableDictionary *data = [[NSMutableDictionary alloc] init]; 
[data setObject:@"User" forKey:@"username"]; 
[data setObject:@"password" forKey:@"password"]; 
[data setObject:pinStr forKey:@"pin"]; 
[data writeToFile:path atomically:YES]; 
[data release]; 
} 

,或者有通過互聯網&還檢查計算器一些文章,但沒有找到任何更好的解決方案。

我沒有在dealloc方法中將viewout設置爲。它是否會產生任何問題?

我的應用程序在發生泄漏時隱藏背景。並在控制檯上我得到警告「內存級別不正常(20%)」

那麼,如何處理tableviewcontroller的背景隱形問題。它在模擬器上工作正常。但是有時會隱藏背景的設備有什麼問題。

請幫我...

回答

1

如果你沒有做任何NSCoding自己,負責來電者是最有可能被解碼它的筆尖文件的UIViewController。你收到的記憶警告符合這個假設。

當內存警告提出時,UIViewController的標準實現將釋放它的視圖,如果不可見(沒有超級視圖)。因此,如果沒有人保留這個視圖,那麼該視圖的所有子視圖都會收到一條發佈消息並進行交易。但通常viewController至少會保留它的一些視圖子視圖,通過它的IBOutlet屬性。這是viewDidUnload進場。它在視圖卸載後主要被調用(主要是由於內存警告)。這是你真的應該釋放你視圖的所有保留子視圖的地方。這是每個IBOutlet和你在viewDidLoad中創建的所有東西。真的沒有必要持有它們。它們都將在需要時從筆尖重新創建。

在您的dealloc方法中,您必須發佈所有保留的屬性以及所有保留的不包含屬性的ivars。請閱讀Memory Management Programming Guide

如果這沒有幫助。我們需要你的屬性聲明和有問題的Controller的viewDidLoad,viewDidUnload,dealloc方法。

+0

hi tonclon,問題在於IBoutlet。我已經發布了每個IBoutlet的屬性,但忘了將它們設置爲零。這個鏈接幫我最終從問題中解脫出來http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmNibObjects.html#//apple_ref/doc/uid/TP40004998-SW2 – 2010-07-27 11:25:24

+0

IBOutlet的最佳實踐是釋放它們並在dealloc方法中設置nil。並在viewDidUnload方法中設置self。 = nil。最後,應用程序在設備上運行時性能良好此外,使用儀器的設備上也沒有內存泄漏。將屬性設置爲零是我的問題的最終解決方案。 – 2010-07-27 11:28:54