我可以在块运行之前释放在块之外创建的对象吗?

时间:2012-06-05 19:23:14

标签: objective-c memory-management objective-c-blocks

可以在阻止之前安全释放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];

3 个答案:

答案 0 :(得分:4)

不,你不能在块之前释放数组,因为在你的块有机会保留它之前,在释放调用之后,数组中的对象和数组本身将无法使用。

您可以自动释放阵列,在这种情况下,释放将在函数退出后发生。

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

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

[myNode runAction:block];

答案 1 :(得分: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];

块在创建时保留捕获的对象(数组)。

答案 2 :(得分:2)

没有。你会在块中保留一个悬空指针。