2013-07-01 23 views
8

有一個有趣的問題,其中有一個類在XIB佈局(UIScrollView的子類)中引用,並沒有根據儀器/分配和在它的dealloc例程中不會中斷。我們稱之爲Sclass1。從XIB的ARC類的IOS 6.1沒有得到釋放,UIClassSwapper

有一個使用類(我們稱之爲Uclass),它具有XIB文件和插座。

@property (nonatomic, weak) IBOutlet Sclass1* sclass1; 

這被正確地掛鉤到XIB文件佈局。

Sclass1是加載Xclass for Uclass時分配的屬性。 Uclass不會重新分配然後不時重新創建,因此我們有另一個Sclass1實例,但Sclass1永遠不會消失,並且找不到另一個參考。

在Instrument中鑽取顯示一個Malloc,就是這樣。

僅供參考,類獲取開始

[UIClassSwapper initWithCoder:] 

回答

0

我覺得你@property應該是強的一類:

@property (nonatomic, strong) IBOutlet Sclass1* sclass1; 

因爲strong是相當於retain和ARC將管理的釋放您。

屬性的章節中,您將獲得有關Transitioning to ARC Release Notes的Apple文檔的更多信息。

+0

這是正確的答案,任何屬於IBOutlet的東西都必須很弱,視圖不會被釋放,因爲控制器有一個到插座的保留點,插座有一個對控制器的引用。創建一個保留週期。有一個upvote。 –

5

如果一個對象在ARC下沒有被釋放,這意味着它存在的強引用。由於您的屬性是weak,對象必須由Uclass對象以外的其他屬性強制擁有(否則它將在XIB加載後立即解除分配)。在代碼中您提供目前尚不清楚這是什麼對象的實際強所有者,但我相信它可能是一個(或多個)以下:

  1. 由於對象的類是UIView如果作爲subviews之一添加,它可能(強烈)以superview爲參考。這在加載XIB文件時自動發生。如果superview沒有被取消分配,那麼SClass對象也不會被取消分配。您可以通過調用刪除此所有權removeFromSuperview
  2. 一個強烈的主人翁週期(保持週期)的SClass1對象的實例變量之間的某處(即強擁有實例變量的一個具有很強的借鑑回到它的主人 - 在SClass1) 。請注意,任何使用self的塊直接也會保留強烈的參考。然後強烈參考該塊,通常會導致保留週期。將self保存爲__weak var,然後將其傳遞給該塊,除非您有充分理由不這樣做。
  3. 通過例如手動創建的強參考。將該對象添加到容器或將指針保存到非變量__weak

請嘗試查找並移除這些強大的所有權。只有在全部刪除後,對象才能被釋放。

1

由於您的財產很薄弱並且仍未解除分配,因此請查找對Sclass或其所有者Uclass的強引用。也許你直接在塊中使用Uclass(或Sclass),沒有__weak typeof(self)weakSelf舞蹈,並且此塊創建保留週期。同時注意親子關係和代表。也許有代表強者而非弱者,或者兩名控制者堅持引用彼此。

此外,如果你想有更詳細的答案,請張貼更多相關的代碼。

+0

感謝您指出塊誘導的保留週期。這確實是IMO的一個常見情況。補充說,以及我的答案。 – burax

0

最近,我有相同的症狀 - 爲了解決它在我的情況,我的目標是作爲委託其他一些對象,所以必須從所有其委託的職責釋放對象之前,它會調用的dealloc

相關問題