Я работаю над проектом, в котором я должен попробовать выполнить данный метод в течение заданного времени (см. Его как автоматический режим), и если в автоматическом режиме нет преуспеть, переключитесь в ручной режим. Чтобы предупредить вас, я довольно новичок в Objective-C и iOS dev, поэтому ошибка может быть очевидной.Проблема с памятью Objective-C с помощью performSelector и бесконечного цикла
До сих пор, вот что я сделал:
-(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 никогда не вызывается.
Я попытался просто напечатать «тест» в журналах (вместо того, чтобы на самом деле вызвать функцию «captureImage»), и когда я это делаю, все в порядке.
Я не могу опубликовать код captureImage, но метод пытается получить изображение из AVCaptureSession, а затем обрабатывает его на нем.
В любом случае, я не понимаю, почему switchManualMode вызывается в случае, а не в другом.
несколько заметок: почему '@ autoreleasepool'? вы должны указать, что '[alert show]' должен выполняться до основного потока - в настоящее время вы работаете в фоновом потоке. Захват изображений снова и снова будет приводить к исключительно высокой производительности процессора и памяти. – luk2302
Я добавил @autoreleasepool, потому что это то, что я нашел при поиске решения для выпуска памяти с бесконечными циклами. И [alert show] отлично работает, когда я заменю captureImage на NSLog в комментарии. – Chris
он не будет работать отлично, он не будет определен в какой момент времени будет отображаться вид предупреждения. если он работает для вас прямо сейчас: отлично. он не будет продолжаться. – luk2302