簡體   English   中英

Objective C內存泄漏問題

[英]Objective C memory leak issue

泄漏工具告訴我,我的代碼片段有泄漏。 為什么會這樣?

此代碼片段位於viewDidLoad()

UINavigationItem *navItem=[self navigationItem];

UIBarButtonItem *addFeed = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addFeed)];
[navItem setRightBarButtonItem:addFeed]; // leaks says that 128 bytes leaked
[addFeed release];

UIBarButtonItem *reload = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh  target:self action:@selector(reload)];
[navItem setLeftBarButtonItem:reload]; // leaks says that 128 bytes leaked here too !
[reload release];
[navItem release];

你不應該發布navItem 您沒有分配/保留/新建/創建它,因此您不會釋放它。

除此之外,您的代碼看起來很好。 是方法中的一切嗎?

泄漏儀器只告訴你泄漏的內存分配在哪里; 它無法告訴你應該釋放內存的位置但是因為沒有可能的方法讓它知道。 你的泄漏正在其他地方發生

這段代碼大部分都沒問題,除非你不應該在最后發布navItem 您不是它的所有者,因為您沒有在其名稱中使用名為allocnewcopy的方法創建它,因此您不應該發布它。

如果您仍然收到泄漏消息並且無法追蹤該錯誤,您可以嘗試使用最新最好的Xcode(版本3.2)中包含的靜態分析器

構建>構建和分析

它將使用LLVM-Clang以一種漂亮的方式靜態分析您的代碼。

http://developer.apple.com/mac/library/featuredarticles/StaticAnalysis/index.html

更新:

在您的代碼段中:

UINavigationItem *navItem=[self navigationItem];

UIBarButtonItem *addFeed = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addFeed)];
[navItem setRightBarButtonItem:addFeed]; // leaks says that 128 bytes leaked
[addFeed release];

您的泄漏可能來自設置新的rightBarButtonItem而不釋放舊的。

這就是我認為正在發生的事情:

1)獲取navigationItem的句柄(右邊的條形按鈕A)

2)創建一個新的UIBarButton項目(制作右側欄按鈕B)

3)setRightBarButtonItem為按鈕B

現在按鈕A在哪里? 設置新按鈕時應該由navItem釋放。 因此,當您第一次設置按鈕時,您可能忘記釋放按鈕,或者您已將其保留在其他位置。

你有NSZombieEnabled嗎? 這會導致NSZombie實例不保留對象,並且在運行Leaks工具時會看到“泄漏”。

您似乎沒有使用自定義viewDidLoad方法釋放視圖控制器。

 [navItem setRightBarButtonItem:addFeed];

 [navItem setLeftBarButtonItem:reload];

您正在創建這些訪問器中的對象的副本。 這些訪問器將retainCount遞增1.您的訪問器應釋放每個對象,然后立即保留它們。

例:

- (void) setTitle: (NSString*) newTitle {
    if (title != newTitle) {
        [title release];
        title = [newTitle retain]; // Or copy, depending on your needs.
    }

看看這里的技術: 內存管理編程

我相信那是什么了。 所以仔細看看這兩個訪問者。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM