"分配只读变量"

时间:2015-12-06 05:49:05

标签: 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",但我仍然得到了subj错误。

任何人都知道为什么?

2 个答案:

答案 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修饰符才能在一个块内分配。