我有以下代码:
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",但我仍然得到了subj错误。
任何人都知道为什么?
答案 0 :(得分:2)
您的第一个问题是编译器报告的问题,默认情况下,局部变量的值是块捕获的 - 这意味着局部变量不能仅被块修改它的价值使用。
如果将__block
修饰符添加到局部变量,则块将捕获变量 - 这意味着块会看到变量的值,因为它在块时执行并可以修改变量。
添加修饰符将修复您的即时编译错误...
然而您的代码无效。该块作为完成处理程序传递给recycleURLs:completionHandler:
,它将在循环操作完成后异步调用。在方法调用本身返回并执行以下return
语句之后,这可能是;所以返回的值不会是块设置的值,因为块实际上还没有被执行过。
建议您将代码更改为异步设计;例如也许通过将完成处理程序传递给MoveFileToTrash
,然后将其传递给recycleURLs:completionHandler:
。
A,通常要避免,替代选项是使用某种形式的阻止,例如,信号量,有效地同步调用recycleURLs:completionHandler:
。尽管可能不推荐这样做,但有一个原因是调用是异步的 - 可能需要一些时间才能完成 - 同步处理它可能会有效地冻结你的应用程序一段时间。
HTH
答案 1 :(得分:-1)
我相信void Update () {
if(Input.GetKeyDown(KeyCode.Return) && (CurrentLevel == 0)){
CurrentLevel = 1;
Application.LoadLevel (CurrentLevel);
}
if (CharacterMovement.Score == 10) {
CurrentLevel = 2;
CharacterMovement.Score = 11;
Application.LoadLevel (CurrentLevel);
}
if ((CurrentLevel != 5) && (CharacterMovement.Lives == 0)) { // Change this
isLost = true;
Debug.Log ("is now true");
CurrentLevel = 5;
Debug.Log ("current level is set to 5");
Application.LoadLevel (CurrentLevel);
}
if (CurrentLevel == 5) {
Debug.Log ("this is level 5");
if (Input.GetKeyDown(KeyCode.Tab)) {
Debug.Log ("tab is pressed");
}
}
}
需要有一个ret
修饰符才能在一个块内分配。