Einige Fragen zum Blockieren und Kopieren von Objective-C

Ich schreibe einen Code mit Objective-C-Block, aber das Ergebnis verwirrte mich.

@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

Ich bin verwirrt über:

Warum stürzt array2 ab? Was ist der ECHTE Unterschied zwischen Array1 und Array2?Ich habe in einem Artikel gelesen, dass die Blockkopie einen Block vom Stapel zum Heap verschieben wird, aber in der Methode array1 kopiere ich ihn nicht und er funktioniert immer noch. in array3 kopiere ich einfach den zweiten block es wird ok. Warum ?Wo muss ich kopieren, wenn ich Block verwende?

Übrigens, ich führe den Code in Xcode 4.6 unter ARC aus. Vielen Dank

Antworten auf die Frage(3)

Ihre Antwort auf die Frage