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

tho*_*mas 1 iphone core-data objective-c

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

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

+----------+
| Class A  |
+----------+
| v :int32 |
+----------+
Run Code Online (Sandbox Code Playgroud)

生成的ManagedObject然后如下所示:

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

//A.m
@implementation A 
@dynamic v;
...
Run Code Online (Sandbox Code Playgroud)

好的,属性标记为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);
Run Code Online (Sandbox Code Playgroud)

这会产生以下输出:

retainCheck1: 1
retainCheck2: 1
retainCheck3: 1
pointer1: 0x62f068
pointer2: 0x62f068
Run Code Online (Sandbox Code Playgroud)

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

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

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

Sim*_*een 6

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

所有你需要做的是确保了每次通话时间alloc,retain,new或者copy在你的代码,它是某处有平衡autoreleaserelease.