我有以下代码:
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/