在IOS上,我有一个NSArray存储blocks
,它在UIView上绘制了一些内容,例如:
^(CGContextRef ctx) {
// drawing rectangle
CGRect rect = CGRectMake(0, 0, 300, 300);
CGContextSetRGBFillColor(ctx, 1, 0, 0, 1);
CGContextFillRect(ctx, rect);
CGContextStrokeRect(ctx, rect);
};
在数组中存储了几个块,我希望在调用drawRect
时执行这些块,这是我的drawRect
- (void)drawRect:(CGRect)rect {
// execute blocks
for(NSDictionary * task in drawTaskQueue)
{
DrawTaskBlock block = [task objectForKey:@"block"];
block(args, UIGraphicsGetCurrentContext());
}
}
但是当我运行代码时,我确定块没有任何错误地执行,但没有任何显示。我错过了什么吗?
答案 0 :(得分:2)
您的代码的问题在于您传递的块需要一个类型为CGContextRef
的参数,而调用代码则传递两个参数 - args
和UIGraphicsGetCurrentContext()
。 / p>
由于Objective-C不检查强制转换,因此您的块最终会以错误的图形上下文运行,从而导致未定义的行为。
要解决此问题,您需要确保块的“签名”与您投射它的块类型的签名相匹配,即DrawTaskBlock
。签名必须包含args
参数的正确类型,即使您的块都没有使用它。