簡體   English   中英

在Objective-C中釋放托管對象

[英]Releasing Managed Objects in Objective-C

好吧,請忍受我對自己情況的描述:

我有一個Core Data模型(在簡化描述中)包括GridManager對象。 GridManager擁有一組Grid對象(通過一對多關系)。 Grid對象包含一組Cell對象(通過一對多關系)。

在我的應用程序中,我有一個GridView,其中包含一系列子視圖(CellView類型)。 GridView具有presentatedGrid屬性,而CellView具有presentedCell屬性(非原子的,保留的)。 在GridView的setRepresentedGrid方法中,我將每個CellView(GridView的子視圖)的namedCell屬性設置為namedGrid中的一個單元格。

現在,我有兩個問題:

首先,由於單元格和網格是托管對象,所以當它們脫歐時,我是否仍需要釋放GridView和CellView類的namedGrid和presentedCell屬性? 我認為我確實做到了(就像使用任何保留的屬性一樣),但是有一點我認為這會導致我的應用出現問題-嗯...只是在想,因為我編寫了自己的設置器,但實際上並沒有保留網格/單元,也許我不需要釋放它們?

其次,一次只有來自gridManager的一個網格處於活動狀態。 當我將gridView.representedGrid從一個網格切換到另一個網格時,如何“釋放”第一個網格(及其關聯的單元),以免不必要地占用內存(假設我們正在談論托管對象)。

非常感謝!

據我了解,您應該並且可以避免使用自定義的getter和setter,然后您可以保留核心數據來完成任務,而不必擔心保留/釋放。

至於減少內存開銷,您可以使用以下方法要求核心數據將對象轉換為故障: refreshObject:mergeChanges:

在此處查看Apple文檔: http : //gemma.apple.com/mac/library/documentation/Cocoa/Conceptual/CoreData/index.html 一切都在這里,希望我能夠為您提供正確的條件。

希望能有所幫助。

如果您的setter保留了托管對象,則需要釋放它們以與保留/釋放相匹配。 但是,您可能不需要保留托管對象,具體取決於應用程序的設計方式。

沒有看到所有代碼,很難給出可靠的建議,但是您可以使用分析儀檢查泄漏,使用儀器來確保內存不會增加不受控制,等等。最后但同樣重要的是,您可以關閉保留,將其切換為分配,然后查看是否崩潰。 由於NSManagedObjectContext將保留對象,因此您的視圖很有可能根本不需要保留NSManagedObject實例。

是的,您需要在dealloc方法中釋放您的namedGrid和RepresentativeedCell屬性。 如果您不這樣做,則保留/釋放方法將無法平衡-您的設置者將保留該對象,並且沒有相應的釋放,該對象將永遠不會被釋放。

正確寫入后,保留設置器將釋放其舊值並保留新值。 因此,設置gridView.representedGrid時無需釋放舊網格。

您為什么出於好奇而編寫自己的二傳手?

暫無
暫無

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

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