【发布时间】:2015-07-10 08:42:02
【问题描述】:
我正在做一个项目,我必须尝试在给定的时间内执行给定的方法(将其视为自动模式),如果自动模式不成功,我将切换到手动模式。提醒你一下,我对 Objective-C 和 iOS 开发人员还很陌生,所以错误可能很明显。
到目前为止,这是我所做的:
-(void)viewDidLoad {
[self performSelector:@selector(autoMode) withObject:nil afterDelay:1.0];
[self performSelectorInBackground:@selector(switchManualMode) withObject:nil];
}
-(void)autoMode {
@autoreleasepool {
while (isAutoMode == true) {
if ([session isRunning])
[self captureImage];
// NSLog(@"test");
}
}
}
-(void)switchManualMode {
[NSThread sleepForTimeInterval:2.0f];
isAutoMode = false;
self.button.enabled = true;
UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Changement de mode"
message:@"Du a un délai trop long, la capture automatique va être desactivée. La capture se fait maintenant de manière manuelle Touchez l'écran pour prendre une photo."
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
}
我有几个问题:
- 第一个是内存使用高峰,应用崩溃。
- 第二个是永远不会调用 switchManualMode。
我尝试只在日志中打印“test”(而不是实际调用函数“captureImage”),当我这样做时,一切都很好。
我无法发布 captureImage 的代码,但该方法会尝试从 AVCaptureSession 中获取图像,然后对其进行一些处理。
无论如何,我不明白为什么在一个案例中调用 switchManualMode 而不是在另一个案例中。
【问题讨论】:
-
一些注意事项:为什么是
@autoreleasepool?您必须指定[alert show]应该在主线程上执行 - 目前您正在后台线程上操作。一遍又一遍地捕获图像只会导致极高的 CPU 和内存使用率。 -
我添加了一个@autoreleasepool,因为这是我在寻找无限循环释放内存的解决方案时发现的。当我在评论中将 captureImage 替换为 NSLog 时,[alert show] 效果很好。
-
它不会完美运行,它不确定在什么时间点实际显示警报视图。如果它现在适合你:太好了。它不会继续。
-
好的,我会尝试找到一种方法来“强制”它在主线程上执行。
-
你是如何定义
isAutoModevar的?
标签: ios objective-c memory infinite-loop performselector