块中的对象创建

时间:2013-10-24 15:24:33

标签: ios objective-c objective-c-blocks

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

我的封锁声明:

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

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

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
};

3 个答案:

答案 0 :(得分:4)

您的块正在修改传递给它的参数。参数按值传递,因此更改的值将被丢弃。

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

答案 1 :(得分: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
};

答案 2 :(得分:0)

您可以对变量使用__block存储类型修饰符来修改块中的它们。如果没有此修饰符,则变量在块的范围内是只读的。这可以让你绕过值传递参数。

Apple's __block variables documentation