将新对象分配给块中的参数对象

时间:2013-04-05 09:47:41

标签: ios objective-c block

说我有一个像这样的块:

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
似乎你不能以这种方式将块分配给块中的参数,有没有办法做到这一点?此块作用于不同的对象,如果对象为零,则需要分配它。在此状态下,某些对象仅在范围内分配(因此obj已分配,但未分配someObject)。香港专业教育学院尝试使用__block,但我不认为这是为了什么。

3 个答案:

答案 0 :(得分:3)

你也可以选择这种方法:

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

答案 1 :(得分:1)

对于示例 - 在标题或类似内容中声明类似于此的typedef:

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: (
)

希望这会有所帮助

答案 2 :(得分:1)

说到参数,块就像函数一样。你在这里做的是类似于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);
相关问题