我们应该指向具有弱指针而非强指针的NSManagedObject实体吗?

use*_*951 2 xcode objective-c nsmanagedobject

我认为因为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];
Run Code Online (Sandbox Code Playgroud)

...

然而在某个地方:

tvc.categoryNearby 变成零.

我不知道它是如何,何时或何地变为零.

我该如何调试?或者参考是否应该强大?

这是NearbyShortcutTVC的界面

@interface NearbyShortcutTVC : BGBaseTableViewCell{

}
@property (weak, nonatomic) CategoryNearby * categoryNearby;

@end
Run Code Online (Sandbox Code Playgroud)

为了确保我们正在讨论同一个对象,我打印了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
)
Run Code Online (Sandbox Code Playgroud)

我修改了我的调试功能来打印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;
}
Run Code Online (Sandbox Code Playgroud)

造成:

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"
)
Run Code Online (Sandbox Code Playgroud)

问题解决了,但仍然很奇怪.即使参考较弱,也不应该将该类别附近纳入.它是NSManagedObject的子类,由托管对象上下文直接管理.此外,当引用很强时,我仍然可以访问它,这表明该对象仍在内存中.

那怎么会变成零呢?

rob*_*off 7

如果你想NSManagedObject留下来,你需要保持强烈的参考(或把它放在一个强烈保存其内容的容器中).托管对象上下文不会对与其关联的所有对象保持强引用.

" 核心数据编程指南 "中的"托管对象上下文的角色"说:

但是,默认情况下,托管对象与其上下文之间的引用很弱.这意味着通常您不能依赖上下文来确保托管对象实例的寿命,并且您不能依赖托管对象的存在来确保上下文的寿命.换句话说,仅仅因为你提取了一个对象并不意味着它会留在身边.

它接着解释时候上下文极力挽留的对象,以及如何改变的背景下总是极力挽留的对象,你应该如何确保你需要的不是释放的对象.