Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在块中创建对象_Ios_Objective C_Objective C Blocks - Fatal编程技术网

Ios 在块中创建对象

Ios 在块中创建对象,ios,objective-c,objective-c-blocks,Ios,Objective C,Objective C Blocks,我试图在我的块调用中创建视图控制器,当它从块返回时,我的对象变为零。如何修复它 我的区块声明: typedef void (^GetViewController)(UIViewController *viewController, int index); 需要VC时调用块(viewController现在为零) 在另一个类中设置VC self.myController.getViewController = ^(UIViewController *viewController, int ind

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

我的区块声明:

typedef void (^GetViewController)(UIViewController *viewController, int index);
需要VC时调用块(viewController现在为零)

在另一个类中设置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
};

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


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

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


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

您可以对变量使用_块存储类型修饰符来修改块中的变量。如果没有此修饰符,变量在块的范围内是只读的。这将帮助您按值传递参数


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


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

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

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

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

我把它改成了回报VC,效果很好,但后来我意识到苹果是如何做到这一点的。我让dataSource成为委托,现在它的可重用性更强了。我把它改成了返回VC,它工作得很好,但后来我意识到苹果是如何做到这一点的。我使dataSource成为委托,现在它的可重用性更强了