gpt4 book ai didi

objective-c - 带 block 的 NSUndoManager

转载 作者:搜寻专家 更新时间:2023-10-30 20:20:52 28 4
gpt4 key购买 nike

在我期望支持 block 的所有事情中,奇怪的是 NSUndoManager 似乎并没有这样做。这是否存在某些内在原因,或者 Apple 根本没有抽出时间对这一点 API 进行现代化改造?

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

- (void)performBlock {
void (^block)(void) = (id)self;
block();
}

为了能够调用,

[[undoManager prepareWithInvocationTarget:^{
NSLog( @"hello world" );
}] performBlock];

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

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

最佳答案

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

但是,我发现您所写的内容存在一些问题。首先,您在 NSObject 上添加了一个类别方法,但是如果您在一个不是 block 的对象上调用它,它将崩溃。也许有一种方法可以解决这个问题,例如让 performBlock 方法在非 block 上调用时不执行任何操作,或者至少在崩溃前记录错误。我不太清楚这是怎么回事。

此外, block 从堆栈开始,因此您需要先复制它们,然后再将它们传递到一个方法中,以便稍后执行。为获取 block 而编写的方法会处理这个问题。大概 -[NSUndoManager prepareWithInvocationTarget:] 不会复制传入的目标。因此,您需要自己复制 block (使用 -copyBlock_copy ()) 在传入之前:

void (^block)(void) = [^{
NSLog(@"hello world");
} copy];

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

至少在 ARC 的早期版本中,这仍然是一个问题,因为 block 被传递到一个需要 id 的方法中(如 Mike Ash 的 ARC article 的 block 部分中所述)。也许它已经修好了?我不会指望它...

关于objective-c - 带 block 的 NSUndoManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11534321/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com