首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带块的NSUndoManager

带块的NSUndoManager
EN

Stack Overflow用户
提问于 2012-07-18 04:29:26
回答 1查看 482关注 0票数 3

在我希望支持块的所有东西中,NSUndoManager似乎没有这么做。这有什么内在的原因吗?还是苹果根本就没有把这个API现代化?

我特别想在NSObject上定义一个方法,

代码语言:javascript
复制
- (void)performBlock {
    void (^block)(void) = (id)self;
    block();
}

为了能打电话,

代码语言:javascript
复制
[[undoManager prepareWithInvocationTarget:^{
    NSLog( @"hello world" );
}] performBlock];

我错过了什么吗?这个有什么问题吗?

(受2009年Mike 文章的启发,它建议不要在块上定义方法。我也在那里留下了评论。)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-18 04:40:10

我认为Mike的主要论点是,它产生了难以阅读的代码,而不是这个想法存在根本问题。

不过,我发现你写的东西有几个问题。首先,您要在NSObject上添加一个分类方法,但是如果在一个不是块的对象上调用它,它就会崩溃。也许有一种方法可以解决这个问题,比如让performBlock方法在非块上调用时什么也不做,或者至少在崩溃之前记录一个错误。我不太清楚这是怎么回事。

此外,块从堆栈中开始,因此在将它们传递到一个方法中之前,您需要将它们复制到一个方法中,以便在以后执行它们。方法编写成一个块来处理这个问题。据推测,-[NSUndoManager prepareWithInvocationTarget:]没有复制传入的目标。因此,在传入该块之前,您需要自己复制它(使用-copyBlock_copy()):

代码语言:javascript
复制
void (^block)(void) = [^{
    NSLog(@"hello world");
} copy];

[[undoManager prepareWithInvocationTarget:block] performBlock];
[block release];

至少在早期版本的ARC中,这仍然是一个问题,因为块正被传递到一个期望id的方法中(如Mike的弧形物品中的块部分所解释)。也许已经修好了?我不会指望它..。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11534321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档