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模式来解释
答案 0 :(得分:6)
你不应该关心Core Data对象如何管理它的内存,只要相信它会正确地做到这一点。查看对象的保留计数很少有用,因为它可以根据Cocoa SDK中的许多内容进行更改。
您需要做的就是确保每次在代码中调用alloc
,retain
,new
或copy
时,都会在某处与autorelease
或release
。
答案 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框架以自己的方式处理它,以确保内存管理规则成立。