【问题标题】:Assign new object to parameter object in block将新对象分配给块中的参数对象
【发布时间】:2013-04-05 09:47:41
【问题描述】:

说我有这样的块:

Object someObject = nil;

block = ^(Object *obj){

    if(obj == nil)
        obj = [[Object alloc] init];
};

block(someObject); //someObject is still nil
block(someObject); //it will assign again, instead of not

NSLog(@"result: %@", someObject); //still nil

您似乎无法以这种方式将事物分配给块中的参数,有什么方法可以做到吗?此块作用于不同的对象,如果对象为nil,则需要对其进行赋值。在这种状态下,某些对象仅在范围内分配(因此分配了obj,但未分配someObject)。我试过使用__block,但我不认为这就是它的用途。

【问题讨论】:

    标签: ios objective-c block


    【解决方案1】:

    您也可以采用这种方法:

    __block Object someObject = nil;
    block = ^(void)
    {
      if(someObject == nil)
        someObject = [[Object alloc] init];
    }
    block();
    

    【讨论】:

    • 对于我需要做的事情,这是行不通的,因为这个块存在于很多地方,并且对象不会来自正在执行块的上下文
    【解决方案2】:

    当涉及到参数时,块就像函数一样。您在此处所做的操作类似于 Apple 的 API 处理 NSErrors 的方式。

    试试这个:

    Object * someObject = nil;
    
    block = ^(Object **obj){
    
        if(obj != nil && *obj == nil)
            *obj = [[Object alloc] init];
    };
    
    block(&someObject); //someObject is still nil
    block(&someObject); //it will assign again, instead of not
    
    NSLog(@"result: %@", someObject);
    

    【讨论】:

    • 啊混蛋,这确实有效,这就是答案,但你似乎只能使用局部变量,如果我在标题中定义了一个变量,我不能&variable它:/passing address of non-local object to __autoreleasing parameter for write back
    • 另一种方法是使用 __block 变量,而不像其他少数人建议的那样将其用作参数。我认为两者之间没有办法。
    • 该死的,我希望传递这个块来对对象做一些初始化 + 一些其他设置代码,所以 someObject 会根据它的位置而改变,所以我不能将它用作像这样的局部变量......哦,好吧,我猜我必须想出其他方法
    • @Fonix:您可以尝试将参数更改为^(Object * __strong *obj),看看它是否更适合您
    【解决方案3】:

    对于示例 - 在您的标题或其他内容中声明类似于此的 typdef:

    typedef void (^ActionBlock)(NSArray **array);
    

    然后像这样使用它:

    __block NSArray *array = nil;
    NSLog(@"Before: %@",array);
    ActionBlock block = ^(NSArray **array)
    {
        if(*array == nil)
            *array = [[NSArray alloc] init];
    };
    block(&array);
    NSLog(@"After: %@",array);
    

    输出:

    2013-04-05 21:05:23.153 TestingSuite[62813:c07] Before: (null)
    
    2013-04-05 21:05:23.155 TestingSuite[62813:c07] After: (
    )
    

    希望对你有帮助

    【讨论】:

    • 我已经尝试过了,但无济于事......也许我错过了一些东西
    • 我会写一个样本-给我一秒钟
    猜你喜欢
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    • 2021-01-05
    • 2012-07-21
    • 2015-11-05
    相关资源
    最近更新 更多