在我希望支持块的所有东西中,NSUndoManager似乎没有这么做。这有什么内在的原因吗?还是苹果根本就没有把这个API现代化?
我特别想在NSObject上定义一个方法,
- (void)performBlock {
void (^block)(void) = (id)self;
block();
}为了能打电话,
[[undoManager prepareWithInvocationTarget:^{
NSLog( @"hello world" );
}] performBlock];我错过了什么吗?这个有什么问题吗?
(受2009年Mike 文章的启发,它建议不要在块上定义方法。我也在那里留下了评论。)
发布于 2012-07-18 04:40:10
我认为Mike的主要论点是,它产生了难以阅读的代码,而不是这个想法存在根本问题。
不过,我发现你写的东西有几个问题。首先,您要在NSObject上添加一个分类方法,但是如果在一个不是块的对象上调用它,它就会崩溃。也许有一种方法可以解决这个问题,比如让performBlock方法在非块上调用时什么也不做,或者至少在崩溃之前记录一个错误。我不太清楚这是怎么回事。
此外,块从堆栈中开始,因此在将它们传递到一个方法中之前,您需要将它们复制到一个方法中,以便在以后执行它们。方法编写成一个块来处理这个问题。据推测,-[NSUndoManager prepareWithInvocationTarget:]没有复制传入的目标。因此,在传入该块之前,您需要自己复制它(使用-copy或Block_copy()):
void (^block)(void) = [^{
NSLog(@"hello world");
} copy];
[[undoManager prepareWithInvocationTarget:block] performBlock];
[block release];至少在早期版本的ARC中,这仍然是一个问题,因为块正被传递到一个期望id的方法中(如Mike的弧形物品中的块部分所解释)。也许已经修好了?我不会指望它..。
https://stackoverflow.com/questions/11534321
复制相似问题