Core Data Memory Management - Reducing Memory Overhead

使用Core Data 中經常遇到的一個很重要的問題就是內存問題,因此需要很謹慎地考慮內存問題,否則在工程規模比較大或者操作大量數據的時候就顯得尤爲重要,下面是Apple官方文檔的說明。


OverView

It is sometimes the case that you want to use managed objects on a temporary basis, for example to calculate an average value for a particular attribute. This causes your object graph, and memory consumption, to grow. You can reduce the memory overhead by re-faulting individual managed objects that you no longer need, or you can reset a managed object context to clear an entire object graph. You can also use patterns that apply to Cocoa programming in general.


1、You can re-fault an individual managed object using NSManagedObjectContext's refreshObject:mergeChanges: method. This has the effect of clearing its in-memory property values thereby reducing its memory overhead. (Note that this is the same as setting the property values to nil - the values will be retrieved on demand if the fault is fired).


2、When you create a fetch request you can set includesPropertyValues to NO to reduce memory overhead by avoiding creation of objects to represent the property values. You should typically only do so, however, if you are sure that either you will not need the actual property data or you already have the information in the row cache, otherwise you will incur multiple trips to the persistent store.


3、You can use the reset method of NSManagedObjectContext to remove all managed objects associated with a context and "start over" as if you'd just created it. Note that any managed object associated with that context will be invalidated, and so you will need to discard any referenes to and re-fetch any objects associated with that context in which you are still interested.


4、If you iterate over a lot of objects, you may need to use local autorelease pool blocks to ensure temporary objects are deallocated as soon as possible.


5、If you do not intend to use Core Data's undo functionality, you can reduce your application's resource requirements by setting the context's undo manager to nil. This may be especially beneficial for background worker threads, as well as for large import or batch operations.


6、Finally, Core Data does not by default keep strong references to managed objects (unless they have unsaved changes). If you have lots of objects in memory, you should determine the owning references. Managed objects maintain strong references to each other through relationships, which can easily create strong reference cycles. You can break cycles by re-faulting objects (again by using the refreshObject:mergeChanges: method of NSManagedObjectContext).



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章