【发布时间】:2011-09-05 00:11:15
【问题描述】:
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 似乎没有被 setter 保留。
我在做某事吗?我的测试错了吗?还是 NSManagedObject-setter 的行为与标题中描述的不同?
编辑:我调用retainCount 是因为我想观察retain not release 或autorelease。观察到的行为可以用 Abizern 链接的享元模式来解释
【问题讨论】:
标签: iphone objective-c core-data