0

我试图在我的块调用中创建视图控制器,当它从块返回时,我的对象变为 nil。如何解决?

我的块声明:

typedef void (^GetViewController)(UIViewController *viewController, int index);

需要 VC 时调用块(viewController 现在为零)

self.getViewController(viewController, index);

在另一个类中设置 VC

self.myController.getViewController = ^(UIViewController *viewController, int index)
{
    switch (index) {
        case Option1:
            viewController = [[Option1VC alloc] init];
            break;
        case Option2:
            viewController = [[Option1VC alloc] init];
            break;
        default:
            break;
    }
//at this point VC is created
};
4

3 回答 3

4

您的块正在修改传递给它的参数。参数是按值传递的,所以改变的值被丢弃。

为什么不让块返回视图控制器作为块结果?这样,编译器应该生成代码,使其保持活动状态,直到调用者有机会将结果分配给强变量。

于 2013-10-24T15:37:33.027 回答
1

指向指针的指针是一个选项,即

typedef void (^GetViewController)(UIViewController** viewController, int index);

...

self.myController.getViewController = ^(UIViewController** viewController, int index)
{
    *viewController = nil; // Avoid random value

    switch (index) {
        case Option1:
            *viewController = [[Option1VC alloc] init];
            break;
        case Option2:
            *viewController = [[Option1VC alloc] init];
            break;
        default:
            break;
    }
//at this point VC is created
};
于 2013-10-25T10:50:23.967 回答
0

您可以在变量上使用 __block 存储类型修饰符来在块中修改它们。如果没有这个修饰符,变量在块的范围内是只读的。这应该可以帮助您按值传递参数。

Apple 的 __block 变量文档

于 2013-10-24T17:14:35.527 回答