核心日期属性的设置者如何管理内存?

问题描述

| CoreData属性的设置器是否保留?或复制值或设置员是什么?我想知道是否必须(自动)释放要放入设置器中的值。 我已经对此进行了一些快速测试。假设以下模型:
+----------+
| Class A  |
+----------+
| v :int32 |
+----------+
生成的ManagedObject如下所示:
//A.h
@interface A :  NSManagedObject  
{
}
@property (nonatomic,retain) NSNumber * v;
//...

//A.m
@implementation A 
@dynamic v;
...
好的,该属性已标记为“保留”,因此,如果我将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。 我在做某事吗?我的考试错了吗?还是NSM​​anagedObject-setter的行为与标题中描述的不同? 编辑:我之所以打电话给retainCount,是因为我想观察一个不释放或自动释放的保留。观察到的行为可以通过Abizern链接的flyweight模式来解释     

解决方法

        首先-不必担心Core Data如何管理其属性-只要释放您拥有的对象,这才是重要的。 其次-您正在使用NSNumber进行测试。 NSNumber是一个采用flyweight设计模式的奇怪类,因此获取NSNumber的retainCount不会告诉您任何有关Core Data如何管理其对象的信息。     ,        您不必在乎核心数据对象如何管理其内存,只需相信它会正确地进行操作即可。查看对象的保留计数很少有用,因为它会根据Cocoa SDK中的许多情况而改变。 您需要做的就是确保每次在代码中调用
alloc
retain
new
copy
时,它在某个位置与
autorelease
release
保持平衡。     ,        从《核心数据编程指南》中:   除了始终是非原子的之外,动态属性仅遵守保留或复制属性-分配被视为保留。您应该谨慎使用副本,因为它会增加开销。您不能将副本用于关系,因为NSManagedObject不采用NSCopying协议,并且它与多对多关系的行为无关。 Core Data“ 10”访问器在分配时始终保留属性。 至于
retainCount
,请不要那样看(就像@Abizern和@Simon Goldeen已经提到的)。 iOS框架以自己的方式处理它,以确保内存管理规则成立。     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...