Core Date属性的setter如何管理内存?

时间:2011-05-30 18:56:09

标签: iphone objective-c core-data

CoreData属性的setter是否保留?或复制价值或什么是二传手?我想知道是否必须(自动)释放我放入设置器的值。

我已经做了一些快速测试。假设以下模型:

+----------+
| Class A  |
+----------+
| v :int32 |
+----------+

生成的ManagedObject然后如下所示:

//A.h
@interface A :  NSManagedObject  
{
}
@property (nonatomic, retain) NSNumber * v;
//...

//A.m
@implementation A 
@dynamic v;
...

好的,该属性标记为retain,因此如果我将NSNumber设置为v,则应保留NSNumber。但它不是(我认为)。我做了以下事情:

A *a = ... ;
NSNumber *retainCheck = [[NSNumber alloc] initWithInt:23];
NSLog(@"retainCheck1: %i",[retainCheck retainCount]);
a.v = retainCheck;
NSLog(@"retainCheck2: %i",[retainCheck retainCount]);
NSLog(@"retainCheck3: %i",[a.v retainCount]);
NSLog(@"pointer1: %#x",retainCheck);
NSLog(@"pointer2: %#x",a.v);

这会产生以下输出:

retainCheck1: 1
retainCheck2: 1
retainCheck3: 1
pointer1: 0x62f068
pointer2: 0x62f068

两个NSNumber都是相同的NSNumber实例(相同的指针值 - >因此它没有复制或类似的那样),并且设置器似乎没有保留NSNumber。

我正在做某事。我的测试错了吗?或者NSManagedObject-setters的行为与标题中描述的不一样?

编辑:我正在调用retainCount,因为我想观察一个保留不释放或自动释放。观察到的行为可以通过Abizern链接的flyweight模式来解释

3 个答案:

答案 0 :(得分:6)

你不应该关心Core Data对象如何管理它的内存,只要相信它会正确地做到这一点。查看对象的保留计数很少有用,因为它可以根据Cocoa SDK中的许多内容进行更改。

您需要做的就是确保每次在代码中调用allocretainnewcopy时,都会在某处与autoreleaserelease

答案 1 :(得分:3)

首先 - 不要担心Core Data如何管理它的属性 - 只要你释放你拥有的对象,那就重要了。

其次 - 您正在使用NSNumber进行测试。 NSNumber是一个采用flyweight设计模式的奇怪类,因此获取NSNumber的retainCount并不会告诉您有关Core Data如何管理其对象的任何信息。

答案 2 :(得分:3)

来自Core Data Programming Guide

  

除了始终是非原子的,动态属性只会保留或复制属性 - assign被视为保留。你应该谨慎使用副本,因为它增加了开销。您不能将副本用于关系,因为NSManagedObject不采用NSCopying协议,并且它与多对多关系的行为无关。

核心数据@dynamic访问者始终在分配时保留属性。

对于retainCount,不要那样看(就像@Abizern和@Simon Goldeen已经提到过的那样)。 iOS框架以自己的方式处理它,以确保内存管理规则成立。