3

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ゼロになります。

どのように、いつ、どこで nil になるかはわかりません。

これをデバッグするにはどうすればよいですか? それとも、代わりに参照を強くする必要がありますか?

ちなみにこれが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 に設定されている

ただし、参照を強くすると、もう 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"
)

問題は解決しましたが、まだ奇妙です。参照が弱い場合でも、その categoryNearby を空にしないでください。これは、マネージド オブジェクト コンテキストによって直接管理される NSManagedObject のサブクラスです。また、参照が強い場合でもアクセスできるという事実は、オブジェクトがまだメモリ内にあることを示しています。

では、どうして nil になるのでしょうか。

4

1 に答える 1

8

を残しておきたい場合はNSManagedObject、それへの強力な参照を維持する必要があります (または、その内容を強力に保持するコンテナーに配置します)。管理対象オブジェクト コンテキストは、それに関連付けられているすべてのオブジェクトへの強い参照を保持しているわけではありません。

コア データ プログラミング ガイド』の「管理対象オブジェクト コンテキストの役割」には、次のように書かれています。

ただし、デフォルトでは、管理対象オブジェクトとそのコンテキストの間の参照は弱いです。これは、一般に、コンテキストに依存して管理対象オブジェクト インスタンスの寿命を保証することはできず、管理対象オブジェクトの存在に依存してコンテキストの寿命を保証することもできないことを意味します。別の言い方をすれば、オブジェクトをフェッチしたからといって、それがそのまま残るわけではありません。

コンテキストオブジェクトを強く保持する場合、オブジェクトを常に強く保持するようにコンテキストを変更する方法、必要なオブジェクトが割り当て解除されないようにする方法について説明します。

于 2012-11-06T05:19:29.163 に答える