dict変数を初期化しようとしていますが、片方向の仕組みがなぜ機能しないのか理解できません。ブロック内のオブジェクトを初期化する
ケース1の場合はすべて問題なく、後で使用することができます。
2の場合はすぐに解放されます(ゾンビになります)。後で(ブロック外で)使用しようとすると、プログラムがクラッシュします。
ここに私のクラスのいくつかのコードがあります(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に表示されている方法でこれを行うと何が問題になりますか?
実際のクラッシュの原因は何ですか? –
こんにちはDavid。これらの行はありません。つまり、別の方法のように、ブロックの外側で、後でdictを使用したいときです。DoSomeStuff2(){[dict count]; }。そしてそれはクラッシュするでしょう – majakthecoder
あなたはARCを使用していますか? –