Kilka pytań dotyczących bloku obiektywnego i kopiowania
Piszę jakiś kod za pomocą bloku obiektyw-c, ale wynik mnie pomylił.
@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
Jestem zdezorientowany co do:
dlaczego tablica 2 ulega awarii? jaka jest RZECZYWISTA różnica między array1 a array2?Przeczytałem artykuł, w którym powiedziano, że kopia bloku przeniesie blok ze stosu na stertę, ale w tablicy metod1 nie kopiuję go i nadal działa. w tablicy3 po prostu kopiuję drugi blok, staje się w porządku. czemu ?gdzie muszę używać kopii, gdy używam bloku?BTW, uruchamiam kod w Xcode 4.6, w ARC. Dzięki