c++ - "assignment of read-only variable"

标签 c++ objective-c cocoa

我有以下代码:

bool MyClass::MoveFileToTrash()
{
    bool ret;
    NSArray *files = [NSArray arrayWithObject:url];
    [[NSWorkspace sharedWorkspace] recycleURLs:files completionHandler:^(NSDictionary *newURLs, NSError *error)
    {
        ret = error != nil;
    }];
    return ret;
}

变量“ret”未声明为“const”,但我仍然收到主题错误。

有人知道为什么吗?

最佳答案

您的第一个问题,即编译器报告的问题,默认情况下局部变量的 是由 block 捕获的 - 这意味着局部变量不能仅由 block 修改它的使用值(value)。

如果将 __block 修饰符添加到局部变量,则 block 将捕获 variable - 这意味着 block 将看到变量的值,因为它位于 block 执行的时间,可以修改变量。

添加修饰符将修复您的即时编译器错误...

但是您的代码将不起作用。该 block 作为完成处理程序传递给 recycleURLs:completionHandler:,它将在回收操作完成后异步调用。这可能是方法调用本身返回并执行了以下return 语句之后;所以返回的值不会是 block 设置的值,因为 block 还没有真正执行。

建议您将代码更改为异步设计;例如也许通过将完成处理程序传递给您的 MoveFileToTrash,然后将其传递给 recycleURLs:completionHandler:

A,通常要避免,替代选择是使用某种形式的阻塞,例如信号量,有效地同步调用 recycleURLs:completionHandler:。虽然不建议这样做,但调用异步是有原因的 - 它可能需要一些时间才能完成 - 同步处理它可能会有效地卡住您的应用一段时间。

HTH

关于c++ - "assignment of read-only variable",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34114497/

相关文章:

c++ - HDF5 存储不同大小的字符串属性

objective-c - 如何串联多个NSData?

objective-c - 在 UIScrollView 中获取 CATiledLayer 支持的 View 的图像快照

C++ 流畅的界面

c++ - Qt中如何绘制数据流图?

ios - 在 ARC 上创建 IBOutlets 作为 ivars。内存问题?

cocoa - 阻止弹出窗口成为关键窗口

xcode - 连接不可用 - Lion OSX 升级后出现 Xcode 错误

xcode - Swift:验证是 OS X Playground 中的有效 url

c++ - 如何正确编译和链接 C 程序?