Почему тип блока отличается в массиве? - PullRequest
0 голосов
/ 30 апреля 2019

Я помещаю некоторый блок в массив, затем печатаю тип блока, он отличается, кроме того, код хорошо работает в основной функции, но вылетает в пользовательском классе.

Я не нашел ни одногоинформация для объяснения проблемы.

Хорошо работает в основной функции:

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        NSInteger a = 1;
        int b = 1;
        NSArray *arr = [NSArray arrayWithObjects:^{NSLog(@"%ld",a);}, ^{NSLog(@"first~~~%d",b);}, nil];
        id c = arr[0];
        id d = arr[1];
        NSLog(@"%@, %@",[c class],[d class]);
    }
    return 0;
}

Он печатает ' NSMallocBlock , NSStackBlock '.

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        NSInteger a = 1;
        int b = 1;
        NSArray *arr = [NSArray arrayWithObjects:^{;}, ^{NSLog(@"first~~~%d",b);}, nil];
        id c = arr[0];
        id d = arr[1];
        NSLog(@"%@, %@",[c class],[d class]);
    }
    return 0;
}

Он печатает ' NSGlobalBlock , NSStackBlock ', и происходит сбой в пользовательском классе:

- (instancetype)init {
    if (self = [super init]) {
        int a = 1;
        int b = 1;
        NSArray *arr = [NSArray arrayWithObjects:^{NSLog(@"%ld",a);}, ^{NSLog(@"first~~~%d",b);}, nil];
        id c = arr[0];
        id d = arr[1];
        NSLog(@"%@, %@",[c class],[d class]);
    }
    return self;
}

Я хочу знать, почему это произошловыведите три типа блоков: ' NSGlobalBlock , NSMallocBlock , NSStackBlock ' и почему он вылетел.

...