EXC_BAD_ACCESS, если я вызываю блок Objective-C напрямую - PullRequest
3 голосов
/ 17 октября 2010

Продолжаем пытаться понять блоки в Objective-C. У меня есть следующая функция:

typedef void(^TAnimation)(void);
TAnimation makeAnim(UIView *aView, CGFloat angle, CGFloat x, CGFloat y, 
                    CGFloat width, CGFloat height, UIInterfaceOrientation uiio) {
    return Block_copy(^{
        aView.transform = CGAffineTransformMakeRotation(angle);
        aView.frame = CGRectMake(x, y, width, height);
        [UIApplication sharedApplication].statusBarOrientation = uiio;
    });
}

Когда я пытаюсь сделать следующее:

TAnimation f = makeAnim( ... );
f();

Я получаю EXC_BAD_ACCESS. Однако, если я вместо этого сделаю следующее:

TAnimation f = makeAnim( ... );
[UIView animateWithDuration:0 delay:0 options:0 animations:f completion:NULL];

работает нормально. В чем проблема в первом сценарии?

Ответы [ 2 ]

1 голос
/ 04 июля 2011

Попробуйте использовать NSZombieEnabled. Когда вы освобождаете объект, он превращается в NSZombie, поэтому, когда вы вызываете его, он генерирует исключение. Чтобы активировать NSZombieEnabled, откройте информационное окно для исполняемого файла, перейдите в раздел «Аргументы» и введите NSZombieEnable со значением «да» в «Переменные, которые должны быть установлены в среде:».

0 голосов
/ 23 октября 2011

Очень простой блочный пример, подобный следующему:

#import <Foundation/Foundation.h>

typedef void(^printerBlock)(void);

printerBlock createPrinter(NSString *thingToPrint) {
    return Block_copy(^{
        NSLog(@"Printing: %@", thingToPrint);
    });
}

int main (int argc, char const* argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    printerBlock pb = createPrinter(@"Testing string.");
    pb();

    [pool drain];
    return 0;
}

распечатывает это:

2011-10-22 21:28:14.316 blocker[12834:707] Printing: Testing string.

, когда я компилирую программу как «блокировщик», поэтому должно быть несколькодругая причина - прямой вызов блока не работает.Некоторые причины могут быть связаны с тем, что представление, которое вы передаете, переиздано, и в этом случае вам поможет совет NSZombieEnabled.

Если это не тот случай, когда представление переусердствует, товам захочется запустить это в отладчике и точно определить, где что-то падает.

Нам, вероятно, придется увидеть больше вашего кода, чтобы выяснить, что на самом деле ломается.

...