我认为因为NSManagedObject由managedObject上下文管理,所以指针应该是弱的。
然而,在我的案例中,它经常会回到0。
for (CategoryNearby * CN in sorted) {
//[arrayOfItems addObject:[NSString stringWithFormat:@"%@ - %d",CN.name,[CN.order intValue]]];
NearbyShortcutTVC * tvc=[[NearbyShortcutTVC alloc]init];
tvc.categoryNearby =CN;
// tvc.titleString=[NSString stringWithFormat:@"%@",CN.name];
// tvc.displayed=CN.displayed;
[arrayOfItemsLocal addObject:tvc];
//CN
PO(tvc);
PO(tvc.categoryNearby);
while (false);
}
self.arrayOfItems = arrayOfItemsLocal;
PO(self.categoriesNearbyInArrayOfItems);
[self.tableViewa reloadData];
...
然而在某个地方:
tvc.categoryNearby
变为零。
我不知道它是如何,何时或何地成为零。
我该如何调试?或者参考是否应该强大?
这是NearbyShortcutTVC的界面
@interface NearbyShortcutTVC : BGBaseTableViewCell{
}
@property (weak, nonatomic) CategoryNearby * categoryNearby;
@end
为了确保我们正在讨论相同的对象,我打印了NSArray的所有内存地址
它们都是完全相同的对象。但不知何故,对象的categoryNearby属性在某处神奇地设置为null。
self.categoriesNearbyInArrayOfItems: (
0x883bfe0,
0x8b6d420,
0x8b6f9f0,
0x8b71de0,
0xb073f90,
0xb061a10,
0xb06a880,
0x8b74940,
0x8b77110,
0x8b794e0,
0x8b7bf40,
0x8b7cef0,
0x8b7f4b0,
0x8b81a30,
0x88622d0,
0x8864e60,
0xb05c9a0
)
self.categoriesNearbyInArrayOfItems: (
0x883bfe0,
0x8b6d420,
0x8b6f9f0,
0x8b71de0,
0xb073f90,
0xb061a10,
0xb06a880,
0x8b74940,
0x8b77110,
0x8b794e0,
0x8b7bf40,
0x8b7cef0,
0x8b7f4b0,
0x8b81a30,
0x88622d0,
0x8864e60,
0xb05c9a0
)
我修改了我的调试功能以打印TVC对象,并且它是categoryNearby属性
categoryNearby属性设置为nil
然而,如果我强烈引用它,那就不再是
-(NSArray *) categoriesNearbyInArrayOfItems
{
NSMutableArray *categoriesArray = [NSMutableArray array];
for (NearbyShortcutTVC * tvc in self.arrayOfItems) {
NSString * string = [NSString stringWithFormat:@"%p,%p",tvc,tvc.categoryNearby];
[categoriesArray addObject:string];
}
return categoriesArray;
}
结果:
2012-11-06 12:01:00.878 BadgerNew[66443:c07] self.categoriesNearbyInArrayOfItems: (
"0x8dc96b0,0x88a58b0",
"0x8bde780,0x88b7970",
"0x8be0930,0x88b8870",
"0x8bf1c00,0x88b8ca0",
"0x8bf4070,0x8beab10",
"0x8bf6250,0x8beaf10",
"0x8bf8620,0x8beb390",
"0x8bfae90,0x8beb7b0",
"0x8b707e0,0x8bebbd0",
"0x8b6e160,0x8bebfe0",
"0x8b6ba10,0x8bec450",
"0x8b69a60,0x8bec870",
"0x8b673a0,0x8becc90",
"0x8b648c0,0x8bed0a0",
"0x8b62110,0x8b7dca0",
"0x8b5f890,0x8bedbe0",
"0xd678410,0x8bee0e0"
)
2012-11-06 12:01:10.058 BadgerNew[66443:4503] Interval for this Grab ID is 9.232143
2012-11-06 12:01:10.058 BadgerNew[66443:4503] @(data.count): 20
2012-11-06 12:01:10.414 BadgerNew[66443:c07] self.categoriesNearbyInArrayOfItems: (
"0x8dc96b0,0x88a58b0",
"0x8bde780,0x88b7970",
"0x8be0930,0x88b8870",
"0x8bf1c00,0x88b8ca0",
"0x8bf4070,0x8beab10",
"0x8bf6250,0x8beaf10",
"0x8bf8620,0x8beb390",
"0x8bfae90,0x8beb7b0",
"0x8b707e0,0x8bebbd0",
"0x8b6e160,0x8bebfe0",
"0x8b6ba10,0x8bec450",
"0x8b69a60,0x8bec870",
"0x8b673a0,0x8becc90",
"0x8b648c0,0x8bed0a0",
"0x8b62110,0x8b7dca0",
"0x8b5f890,0x8bedbe0",
"0xd678410,0x8bee0e0"
)
虽然问题已经解决,但仍然很奇怪。即使参考较弱,也不应该将该类别附近纳入。它是NSManagedObject的子类,由托管对象上下文直接管理。此外,当引用很强时,我仍然可以访问它,这表明该对象仍在内存中。
那怎么会变成零?
答案 0 :(得分:7)
如果你希望NSManagedObject
留在身边,你需要对它进行强有力的引用(或者把它放在一个强力保存其内容的容器中)。托管对象上下文不保持对与其关联的所有对象的强引用。
“托管对象上下文的角色”在Core Data Programming Guide中说明了这一点:
默认情况下,托管对象与其上下文之间的引用很弱。这意味着通常您不能依赖上下文来确保托管对象实例的寿命,并且您不能依赖托管对象的存在来确保上下文的寿命。换句话说,仅仅因为你拿走了一个物体并不意味着它会留在那里。
它继续解释上下文 强烈保留对象的时间,以及如何更改上下文以始终强烈保留对象,以及如何确保所需的对象不是解除分配。