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 で示した方法でこれを行うことの何が問題になっていますか?