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

questionAnswers(3)

yourAnswerToTheQuestion