1

dict 変数を初期化しようとしていますが、一方の方法が機能し、もう一方の方法が機能しない理由がわかりません。

ケース 1 ではすべて問題なく、後で dict を使用できます。
ケース 2 では、すぐにリリースされ (ゾンビになります)、後で (ブロックの外で) 使用しようとすると、プログラムがクラッシュします。

iOS用に書かれた私のクラス(c ++とobjective-cの混合)のコードを次に示します。
ブロック内で、変数 dict を 2 つの異なる方法で初期化しようとしました。

class Data
{
public:
    NSMutableDictionary *dict;

    void DoSomeStuff()
    {
    [NSSomeFrameworkTool doSomeStuffWithCompletionHandler:^(NSError *err) {
        // case 1 - OK
        dict = [[NSMutableDictionary alloc] initWithDictionary:[NSKeyedUnarchiver unarchiveObjectWithFile:@"dict.dat"]];

        // case 2 - will crash later if i try to use dict
        dict = [NSKeyedUnarchiver unarchiveObjectWithFile:@"dict.dat"];   }];
    }
}

このクラスにはクラス変数 dict があり、これは DoSomeStuff() メソッドで初期化されます。
そのメソッドは、ブロックを (コールバックとして) 使用する ios フレームワークのメソッドを呼び出して、何らかのタスクが完了したことを通知します。

ケース 1 とケース 2 の動作が異なる理由が気になりました。このブロック内で初期化された、ブロック外の参照を使用することは禁止されているのでしょうか?
case2 で示した方法でこれを行うことの何が問題になっていますか?

4

2 に答える 2

2

最初のケースでは dict を解放しません。2 番目のケースでは自動解放されるため、保持する必要があります。

dict = [[NSKeyedUnarchiver unarchiveObjectWithFile:@"dict.dat"] retain];
于 2011-12-19T15:53:47.830 に答える