Algumas perguntas sobre object-c block and copy
Eu escrevo algum código use object-c block, mas o resultado me confundiu.
@interface MyTest : NSObject
@end
@implementation MyTest
- (void)test {
NSArray *array = [self array1]; // ok
// NSArray *array = [self array2];// crash
// NSArray *array = [self array3];// ok again
dispatch_block_t block0 = (dispatch_block_t)[array objectAtIndex:0];
block0();
dispatch_block_t block1 = (dispatch_block_t)[array objectAtIndex:1];
block1();
}
- (NSArray *)array1 {
int a = 10;
NSMutableArray *array = [NSMutableArray array];
[array addObject:^{
NSLog(@"block0: a is %d", a);
}];
[array addObject:^{
NSLog(@"block1: a is %d", a);
}];
return array;
}
- (NSArray *)array2 {
int a = 10;
return [NSArray arrayWithObjects:^{
NSLog(@"block0: a is %d", a);
}, ^{
NSLog(@"block1: a is %d", a);
}, nil];
}
- (NSArray *)array3 {
int a = 10;
return [NSArray arrayWithObjects:^{
NSLog(@"block0: a is %d", a);
},[^{
NSLog(@"block0: a is %d", a);
} copy], nil];
}
@end
Estou confuso sobre:
por que a falha do array2? qual é a diferença real entre array1 e array2?Eu li algum artigo disse que a cópia do bloco irá mover um bloco de pilha para pilha, mas no método array1, eu não copiá-lo e ainda funciona. em array3 eu apenas copio o segundo bloco que fica ok. porque ?onde eu devo usar a cópia quando eu uso bloco?BTW, eu corro o código no Xcode 4.6, sob ARC. obrigado