2012-12-10 30 views
0

所以想來想去,並在花時間有點無奈試圖尋找內存管理問題我做了一些研究,最後經過屈服於改變到ARC。這是相對無痛的。然而,我的UIViewControllers出現了一個新問題,Pre-arc他們都按照廣告方式工作,我把它們推到堆棧上,他們出現了,我從堆棧中彈出它們的dealloc方法被調用,每個人都很高興。切換到ARC,永遠不會調用dealloc。這是不幸的。所以我做了一些研究這個問題,讓我列出我在做什麼和/或沒有做UIViewControllers和ARC

。首先,我推到堆棧中的觀點是不明確聲明強烈。

.the委託子類具有父類的是unsafe_unretained,但對於覆蓋基地我甚至註釋掉委託設置到父,沒有歡樂。

.Turned關NSzombies爲明顯,將導致東西粘在ARC各地啓用的碼

。我改變了我的代碼,根據布拉德拉鬆斯回答Memory not released in ios view hierarchy,從這個

if (_friendsListVC == nil) 
{ 
    _friendsListVC = [[FriendsListViewController alloc] initWithNibName:nil bundle:nil]; 
    _friendsListVC.delegate = self; 
} 

[self.navigationController pushViewController:_friendsListVC animated:YES]; 

(_friendsListVC是一個成員變量)。爲了這

FriendsListViewController *fVC = [[FriendsListViewController alloc] initWithNibName:nil bundle:nil]; 
//fVC.delegate = self; 
[self.navigationController pushViewController:fVC animated:YES]; 
再次

沒有喜悅,在dealloc中斷點永遠不會被擊中,事情是我推和彈出了很多的意見,我的應用程序,所以這隻會導致更多的內存問題,對那些頂部我改爲ARC以希望修復...

另請注意我在這個視圖以及其他一些其他代碼塊,但我不使用自我,我也閱讀是自我保留,所以你應該當涉及到代碼塊時,參考值很低。

我很樂難倒,任何人都可以闡明我,什麼ARC是幹什麼的?或者我不尊重使用ARC?並且爲了將來的引用,您希望推入到ARC中的視圖層次結構中的所有視圖都不是實例變量?

在此先感謝。

+0

您啓用了nszobie嗎? –

回答

3

我想出什麼問題了,但它並沒有解決這個問題並沒有被dealloc'ed其它控制器,這些都是出於不同的原因完全。因此,在傳播知識和減輕其他人這種痛苦,我要列出的東西的數量,這將可能導致保留週期,大多屬於ARC和UIViewControllers和代碼塊的利益

  1. 不要對您正在推進的觀點有強烈的參考。

  2. 如果您推入視圖層次結構的類中有一個調用push方法的類的委託,使其成爲unsafe_unretained引用,事實上,將所有委託作爲我的委託之一是unsafe_unretained是一個好習慣一個強大的,因爲我認爲ARC轉換器會爲我做。

  3. 關閉NSZombies。不是永恆地介意你,只是因爲當你需要確保dealloc語句被調用時他們應該。

  4. 不要直接引用代碼塊中的self,這會導致保留週期。如果您需要使用self,請在塊外執行以下操作(然後使用weakself)

    __unretained_unsafe className * weakSelf = self;

  5. 謹防靜態引用的,我不能確定這一點,但我不得不歷時兩個實例化視圖控制器和其他頂級推一個的方法,引用了內分配給他們的兩個靜態實例這個類(不要問爲什麼),在他們被使用後歸零後,它似乎解決了我的問題,我不知道爲什麼。

  6. 這是另外一個我不確定的地方,但看到它在某處存在一次或兩次,如果在類中有代碼塊,請儘量不要在該塊中使用實例變量,再次變量__unsafe_unretained。

而且僅此而已,檢查大多數這些並加以修復,我所有的意見後,有推時,每一次,而不是在一些怪異的任意點稱他們dealloc方法。此外,爲了澄清這只是一個簡短的清單,以快速幫助任何人面臨同樣的問題,我並不是說對這裏的一些概念有完整的理解,但我建議你應該,因爲我希望能夠及時。

0

這就是爲什麼儀器存在。運行Leaks工具,它會告訴你什麼分配這些視圖控制器(你已經知道)以及還有什麼我保留它們(你不知道)。

此外,你聲稱存在內存泄漏,但你不知道,直到你運行ObjectAlloc儀器,並看到內存使用實際上攀登重複使用。

+0

我做過泄漏測試,這就是爲什麼我很困惑,即使dealloc從未被調用也沒有泄漏出現。我想我應該詳細闡述我對ARC還是比較陌生的觀點,並不確定是否有讓ARC導致你的泄漏儀器過時或者其他一些奇怪的行爲。然而,如果我推動視圖然後彈出它,沒有dealloc,但如果我推動相同的視圖,然後再彈出它,中提琴,我們dealloc,奇怪的業務,沒有泄漏,所以我想我應該很高興。 – Genhain

+0

泄漏確實與ARC一起工作。然而,你有什麼可能不是泄漏。還有一件事是保留了VC,這就是爲什麼當創建VC的第二個實例時你會發現它最終釋放的原因 - 因爲現在持有的任何一個都保留在新的VC上。我將使用Object Alloc和heapshot來嘗試查看意外保留VC的內容。 –

0

我得到了同樣的問題。

當我從我的項目中禁用NSZombie選項時,它對我很有用。我不知道爲什麼會發生。

  • 轉到ProductEdit方案
  • 禁用NSZombie
+0

正如我向上面的Kendall指出的那樣,在dealloc方法決定它是個好時機之前,我必須不止一次推送和彈出控制器,儘管如此,感謝您的輸入。 – Genhain