0

说我有这样的块:

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,但我不认为这就是它的用途。

4

3 回答 3

3

您也可以采用这种方法:

__block Object someObject = nil;
block = ^(void)
{
  if(someObject == nil)
    someObject = [[Object alloc] init];
}
block();
于 2013-04-05T09:59:05.223 回答
1

对于示例 - 在您的标题或其他内容中声明类似于此的 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: (
)

希望这可以帮助

于 2013-04-05T09:49:29.800 回答
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);
于 2013-04-05T09:56:27.913 回答