Objective-C块不会跳过代码然后执行它

时间:2017-01-15 21:39:05

标签: objective-c gpuimage

我正在使用GPUImage框架,我注意到编译器会自动跳过setColorAverageProcessingFinishedBlock括号内的所有内容。它完全跳过这些内容并继续执行,执行代码中的其他所有内容。一旦执行了其他所有操作,它将返回括号内的内容。显然,这会产生意想不到的副作用。

playerName

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

上述代码存在两个问题:内存管理问题,以及对块如何工作的误解。

首先,您在方法中创建GPUImageVideoCamera实例,但不将其保留为实例变量。我将假设这是使用自动引用计数的代码,如果这是真的,则在您的方法完成后,此相机实例将被释放。充其量,在取消分配之前,您可以从相机捕获一帧。在最坏的情况下,这会在相机和连接到它的整个过滤器链在运行中解除分配时崩溃。

在包含的类上创建一个实例变量,并将GPUImageVideoCamera实例分配给它,使其持续时间足够长。

上面的第二个问题是对如何以及何时执行块的误解。块只是你可以传递的代码段,它们不一定与周围的其余代码串行执行。

在这种情况下,您提供的块是一个回调,将在通过平均颜色操作处理每一帧视频后触发。此处理在后台队列上异步进行,您必须设计代码以确认这一点。

如果要构建X值,请将每个测量值添加到该块内的数组中,然后在块中检查是否要达到X值。在这一点上,平均并与他们做任何事情。基本上,在块中添加一个检查并将其后的代码移动到块中,以便在计数大于X时运行。您可能希望在此时停止相机捕获,如果这就是您所需要的。

答案 1 :(得分:2)

您发布的代码完全按照预期的方式工作。颜色平均处理需要一段时间,因此它在后台线程上完成,因此主线程不会停止。处理完成后,然后调用该块。

任何在处理完成之前都不应执行的代码需要在内部块中执行。