2010-07-27 69 views
6

我有一個視圖控制器顯示UITextField。在這裏,我把鍵盤鍵盤解除內存泄漏

- (void)viewDidAppear:(BOOL)animated 
{ 
    [wordTextField becomeFirstResponder]; 
} 

然後,我有按鈕被駁回鍵盤,無需關閉控制器本身:

- (void)cancel:(id)sender 
{ 
    if([wordTextField isFirstResponder]) 
    { 
     [wordTextField resignFirstResponder]; 
    } 

} 

這種儀器後會告訴我在

# Category Event Type Timestamp RefCt Address Size Responsible Library Responsible Caller 
0 Malloc 128 Bytes Malloc 00:11.239 1 0x3b82550 128 UIKit UIKeyboardInputManagerClassForInputMode 

某處泄漏提到的堆棧[wordTextField resignFirstResponder]

即使我自己不帶鍵盤,讓用戶觸發它,我仍然有泄漏。在這種情況下,我的代碼中沒有提到任何東西。

+0

只是爲了測試我已經創建了新的基於單個'UITextField'的項目,沒有別的。點擊文本字段將彈出kbd並導致上述內存泄漏。我正在使用儀器2.1和Xcode 3.2.2。我應該忽略這種泄漏嗎? – Pablo 2010-07-27 02:53:48

+0

模擬器或設備?如果它的設備請發佈一個示例項目,好奇看到這個。 – 2010-07-27 03:19:13

+0

它是模擬器,但仍然有興趣確保。將在今天晚些時候檢查設備。隨着這個在我的原始項目中,我有2'open_handle_to_dylib_path',據我瞭解谷歌搜索可能是模擬器虛驚一場。但是找不到關於'UIKeyboardInputManagerClassForInputMode'的任何信息,所以可能會有些嚴重。 – Pablo 2010-07-27 03:37:46

回答

7

泄漏儀器顯示的內存不會在應用程序的正常過程中被釋放(因爲沒有任何對它的引用)。這本身並不是什麼大事,它在應用程序退出時會被釋放。很多框架代碼將分配並保留分配的這些非常小的內存塊。我不知道他們是如何運行的錯誤或必不可少的。無論如何,我們必須接受它們是完全正常的。

泄漏會將這些內存塊識別爲「泄漏」,聽起來很糟糕,但這不是真正的「泄漏」,樂器可以幫助您識別。

'真正'的泄漏是在代碼中可以運行多次,並分配一些永遠不會釋放的內存,所以隨着時間的推移將消耗越來越多的內存,直到所有的內存被使用,你的應用程序將崩潰。

所以,如果你有一個應用程序,無論你使用它多長時間,或者不管你如何使用它,它都會泄露128個字節,你通常不必擔心。然而,如果你有一個應用程序說,每次你點擊一個按鈕,它分配一個永遠不會釋放的新字符串 - 無論字符串有多少字節 - 如果用戶按下按鈕足夠多次,這將消耗所有的內存可用於應用程序,並最終崩潰。這是你需要注意的那種泄漏。

泄漏儀器實際上不能分辨兩種之間的差異,但您需要能夠。例如,您可能需要一種單例對象,即只有一個實例,並且需要在應用程序的整個生命週期中存在。您可以在應用程序啓動時創建對象,並且實際上您從不需要釋放此對象,它可以在應用程序退出時被殺死。泄漏會將其標記爲泄漏,並且與您一起工作的其他開發人員認爲這意味着您不知道自己在做什麼會像一個小孩一樣跑到您的老闆身邊,並說:「他正在編寫真正泄漏的代碼,這就是再糟糕的「。而且你的老闆不是程序員,他會認真對待他,因爲它聽起來很糟糕,無論如何,他從一所着名的大學中拿到了2.2的CS,所以他必須知道他在說什麼。當它真的是完全合理的,正是你想要做的。

因此,使用Leaks工具在您的代碼中查找會破壞您的應用程序的錯誤。不要擔心Apple框架中發現的每個字節「泄漏」。

+0

@iPhoneDev:謝謝。順便說一句,在設備上沒有這樣的儀器泄漏。 – Pablo 2010-07-27 12:25:54