Iphone 如果我直接调用Objective-C块,则执行错误访问

Iphone 如果我直接调用Objective-C块,则执行错误访问,iphone,objective-c,objective-c-blocks,Iphone,Objective C,Objective C Blocks,继续尝试理解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(^{

继续尝试理解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\u坏访问。但是,如果我改为执行以下操作:

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

它很好用。第一个场景中的问题是什么?

尝试使用NSZombieEnabled。当您解除分配一个对象时,它会变成NSZombie,因此当您调用它时,它会抛出一个异常。要激活NSZombieEnabled,请打开可执行文件的信息窗口,在参数下,在“要在环境中设置的变量:”下输入值为“是”的NSZombieEnable:。

一个非常简单的基于块的示例如下:

#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;
}
当我将程序编译为“拦截器”时,直接块调用失败肯定还有其他原因。一些原因可能是因为您传递的视图被过度释放,在这种情况下,NSZombieEnabled建议将帮助您解决问题

如果不是视图被过度释放,那么您将希望在调试器中运行它,并准确地找出问题的症结所在


我们可能需要查看更多的代码,以找出实际出现的问题。

在调试器中,它说的是哪一行导致EXC\u BAD\u访问?
2011-10-22 21:28:14.316 blocker[12834:707] Printing: Testing string.