#objective-c
#objective-c
Вопрос:
Я создаю это приложение для записи голоса, но по какой-то причине оно не позволяет мне использовать этот метод удаления без сбоев:
-(void)deleteCurrentFiles {
if(recorder != nil) {
if([recorder isRecording]) {
[recorder stop];
}
[recorder release];
recorder = nil;
[self performSelector:@selector(resetTotalTimeLabel) withObject:nil afterDelay:1.0];
}
if(player != nil) {
if([player isPlaying]) {
[player stop];
}
[player release];
player = nil;
currentTime = 0;
timeSlider.value = 0;
[self performSelector:@selector(resetCurrentTimeLabel) withObject:nil afterDelay:0.1];
}
if(commentRecorder != nil) {
if([commentRecorder isRecording]) {
[commentRecorder stop];
}
}
}
Объявления этих экземпляров:
AVAudioRecorder *recorder;
AVAudioRecorder *commentRecorder;
AVAudioPlayer *player;
В resetTotalTimeLabel
и resetCurrentTimeLabel
нет ссылки на / использование рекордеров / проигрывателя.
Ошибка, которую я получаю,:
-[__NSArrayI finishedRecording]: unrecognized selector sent to instance 0x1b3ba0
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI finishedRecording]: unrecognized selector sent to instance 0x1b3ba0'
*** Call stack at first throw:
(
0 CoreFoundation 0x35f08c7b __exceptionPreprocess 114
1 libobjc.A.dylib 0x30186ee8 objc_exception_throw 40
2 CoreFoundation 0x35f0a3e3 -[NSObject(NSObject) doesNotRecognizeSelector:] 98
3 CoreFoundation 0x35eaf467 ___forwarding___ 506
4 CoreFoundation 0x35eaf220 _CF_forwarding_prep_0 48
5 CoreFoundation 0x35ea3f79 -[NSObject(NSObject) performSelector:withObject:] 24
6 Foundation 0x33fd3e6d __NSThreadPerformPerform 272
7 CoreFoundation 0x35ebc8d1 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ 14
8 CoreFoundation 0x35e8cecd __CFRunLoopDoSources0 384
9 CoreFoundation 0x35e8c6f9 __CFRunLoopRun 264
10 CoreFoundation 0x35e8c50b CFRunLoopRunSpecific 226
11 CoreFoundation 0x35e8c419 CFRunLoopRunInMode 60
12 GraphicsServices 0x35261d24 GSEventRunModal 196
13 UIKit 0x3386557c -[UIApplication _run] 588
14 UIKit 0x33862558 UIApplicationMain 972
15 App Name 0x00002959 main 80
16 App Name 0x00002904 start 40
)
terminate called after throwing an instance of 'NSException'
На самом деле это происходит recorder
после вызова этого метода.. Итак, есть ли что-нибудь, что я должен добавить к этому методу, чтобы заставить его работать?
Любые мысли очень ценятся!
Ответ №1:
отправка сообщения объекту, который не отвечает на него в странный момент времени, является хорошим признаком дисбаланса количества ссылок. запустите свое приложение с включенными зомби в инструментах. воспроизведите сбой и посмотрите, является ли это зомби.
Комментарии:
1. Похоже, это действительно проблема зомби.. Но я не называю это так, насколько мне известно… Может быть, это авторелиз (кстати, я не вызывал никакого авторелиза)? я создаю диктофон как таковой:
recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:amp;error];
2. То, что вы мне сказали, на самом деле заставило меня прийти к следующему выводу: проблема заключается в том, что диктофон не был остановлен (
[recorder stop]
) перед выпуском. По какой-то причине, даже если он не воспроизводится, когда его выпускают, он все равно хочет, чтобы его остановили, я думаю.. Итак, вкратце:if([recorder isRecording]) { [recorder stop]; }
становится: [остановка диктофона];