2

myArrayブロックの前に安全に解放できますか?

NSMutableArray *myArray = [[NSMutableArray alloc] init];
[myArray addObject:@"a"];
[myArray addObject:@"b"];

// releasing here causes an invalid object to be used inside the block?
[myArray release];

CCCallBlock *block = [CCCallBlock actionWithBlock:^{
    // print myArray contents to console
}];

[myNode runAction:block];
4

3 に答える 3

4

他の人が言ったことに加えて、なしautoreleaseで、ブロックが作成された後に配列を解放することができます。その後、配列を使用しなくなった場合。

NSMutableArray *myArray = [[NSMutableArray alloc] init];
[myArray addObject:@"a"];
[myArray addObject:@"b"];

CCCallBlock *block = [CCCallBlock actionWithBlock:^{
    // print myArray contents to console
}];
[myArray release];

[myNode runAction:block];

ブロックは、作成時にキャプチャされたオブジェクト(配列)を保持します。

于 2012-06-06T02:45:37.983 に答える
4

いいえ、ブロックの前に配列を解放することはできません。配列内のオブジェクトと配列自体は、解放の呼び出し後、ブロックがそれを保持する機会を得る前に使用できなくなるためです。

配列を自動解放することができます。その場合、関数が終了した後に解放が行われます。

NSMutableArray *myArray = [NSMutableArray array];
[myArray addObject:@"a"];
[myArray addObject:@"b"];

CCCallBlock *block = [CCCallBlock actionWithBlock:^{
    // print myArray contents to console
}];

[myNode runAction:block];
于 2012-06-05T19:28:20.673 に答える
2

いいえ。ブロック内にダングリングポインタを保持します。

于 2012-06-05T19:28:02.047 に答える