我一直在为 iOS 开发一个 opencv 项目。我得到了一个简单的项目,开始使用捕获和显示的帧进行开发。在我开始遇到内存问题并将它们追溯到原始项目设置之前,我从来没有过多关注它是如何工作的。我现在计划重新编写捕获/显示代码,但我不明白为什么它首先会起作用。有一个播放/暂停按钮调用该方法
- (IBAction)play_pause:(id)sender
{
play = !play;
while(play)
{
if (_videoCapture && _videoCapture->grab())
{
(*_videoCapture) >> _display_frame;
//process frame
self.imageView.image = [UIImage imageWithCVMat:_display_frame];
}
}
}
play 只是一个全局布尔值,表示应用程序是在播放还是暂停。奇怪的是,处理应该发生在一个无限循环中,没有出路。play 在循环中永远不会被修改。尽管如此,当应用程序运行时,播放/暂停按钮保持响应,并且能够翻转播放布尔并暂停执行。不仅如此,其他布尔值(例如use_greyscale)可以被其他按钮翻转,并且它们的值在循环内改变。我原以为应用程序会冻结,甚至永远不会在屏幕上绘制新帧。应用程序在其生命周期的大部分时间里都应该被困在该函数中,无法执行其他任务,例如绘图和 UIControl。似乎唯一可行的方法是 IBAction 调用在其自己的线程上运行。我在源代码中找不到任何线程的证据。有人可以解释一下苹果如何处理其 UI 中的线程吗?我的印象是只有一个主运行循环线程,并且不会自动创建额外的线程。如果这是真的,如何解释这种行为?
边注-
最终让我调查的是 [UIImage imageWithCVMat:_display_frame] 返回一个自动释放的对象。由于所有这些都发生在一个循环内,因此如果不暂停执行,就无法释放对象,这会导致崩溃。