说我有一个像这样的块:
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
,但我不认为这是为了什么。
答案 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);