AVAudioPlayer hata ayıklama modunda kesme noktası atar


108

Uygulamayı her yüklediğimde, bu satırda bir kesme noktası ayarlamışım gibi duruyor:

self.audioPlayer = 
 [[[AVAudioPlayer alloc] initWithData:[dataPersister loadData:self.fileName] 
                                error:&outError] autorelease];

Bu çizginin üstünde veya yakınında herhangi bir yer kesme noktası yok. Yalnızca uygulamayı hata ayıklama modunda çalıştırdığımda ve kesme noktasından sonra hiçbir şey çökmediğinde oluyor. "Program yürütmeye devam et" i tıkladığımda uygulama hiçbir şey olmamış gibi çalışıyor.

Bu, aşağıdakilerle çağrılan loadData yöntemidir initWithData:

-(NSData*)loadData:(NSString*)fileName
{
    NSString *dataPath = [self.path stringByAppendingPathComponent:fileName];
    dataPath = [dataPath stringByStandardizingPath];
    NSData *data = [[[NSData alloc] initWithContentsOfFile:dataPath]autorelease ];
    return data;
}

LoadData işlevi iyi çalışıyor gibi görünüyor. İstenen mp3 dosyası, kesme noktasından sonra sorunsuz bir şekilde yüklenir ve oynatılır.

Neyi yanlış yaptığım hakkında bir fikrin var mı?

DÜZENLEME: Kesme noktasında durduğunda bir geri izleme çalıştırdım. Sonuç şuydu:

(lldb) bt
* 1 numaralı iş parçacığı: tid = 0x1c03, 0x30df1724 libc ++ abi.dylib`__cxa_throw, durdurma nedeni = kesme noktası 1.2
    çerçeve no 0: 0x30df1724 libc ++ abi.dylib`__cxa_throw
    çerçeve # 1: 0x36403a24 AudioToolbox`ID3ParserHandle :: ID3ParserHandle (void *, long (*) (void *, unsigned long, unsigned long, unsigned long, void **, unsigned long *)) + 452
    çerçeve 2: 0x36403b0e AudioToolbox`ID3ParserOpen + 142
    çerçeve 3: 0x3635bd16 AudioToolbox`MPEGAudioFile :: ParseID3Tags () + 58
    çerçeve # 4: 0x3635b9aa AudioToolbox`MPEGAudioFile :: ParseAudioFile () + 26
    çerçeve # 5: 0x3631723e AudioToolbox`AudioFileObject :: DoOpenWithCallbacks (void *, long (*) (void *, long long, unsigned long, void *, unsigned long *), long (*) (void *, long long, unsigned long , void const *, unsigned long *), long long (*) (void *), long (*) (void *, long long)) + 166
    çerçeve 6: 0x36316480 AudioToolbox`AudioFileOpenWithCallbacks + 612
    çerçeve # 7: 0x31f4c1ec AVFoundation`- [AVAudioPlayer initWithData: hata:] + 120

"ÇÖZÜM": Tüm istisnalar için istisna kesme noktasını devre dışı bırakırsam ve yalnızca Objective-C istisnaları için kesme noktası kullanırsam sorun ortadan kalkar. Ancak AVAudioPlayer tahsisinin bir C ++ istisnası atması sorununu çözmez.


2
Aynı yığın izine sahiptim. "Tüm İstisnalar" kesme noktasını devre dışı bırakmak benim için bunun olmamasını sağladı.
makdad

Yanıtlar:


175

İstisna kesme noktanızı ekleyin ve istisna türünü "Tümü" den "Amaç-C istisnaları" na düzenleyin

AudioToolbox'taki bazı sınıflar normal C ++ istisnaları atar. Onları bu şekilde filtreleyebilirsiniz.


6
Sorumda "ÇÖZÜM" bölümünü yazdığım için bunu bir çözüm olarak görmüyorum. AVAudioPlayerRastgele istisnalar atmak gerekir.
ThomasCle

10
"AVAudioPlayer rastgele istisnalar atmamalıdır" - Bu bizim elimizde değil. Çerçeve bu şekilde yazılır ve onunla yaşamak zorundasınız. Yine de, bunun iyi bir fikir olmadığına katılıyorum
Mugunth

@Mugunth Bu, çerçevenin yanıt verdiği ve dahili hataları düzelttiği anlamına mı geliyor? Bununla ilgili başka belgelerden haberdar mısınız? İnternette fazla bir şey bulamıyorum, bu bana bunun programcı hatası olabileceğini düşündürüyor ...
Sökücü

21

AVAudioPlayer ve AVAudioRecorder her ikisi de istisnalar atar, bunlardan birkaçı. Bunlar oyuncular tarafından dahili olarak ele alınır, ancak "Tüm Kesme Noktaları" için bir kesme noktanız varsa (yani İstisna: Tümü, Kırılma: Atma) bu istisnaları yakalayacaksınız. Bunları yürütmeye devam ederseniz, uygulama normal şekilde çalışmaya devam edecek ve hiç çökmeyecektir.

Şimdiye kadar bulduğum tek çözüm, Kesme Noktası Gezgini'ndeki kesme noktası çubuğuna tıklamak, bu belirli kesme noktasını devre dışı bırakmak ve devre dışı bırakarak çalıştırmak.

Uygulama atılan bir istisnayla çöktüğü zaman / olursa, cmd-6, bu kesme noktasını etkinleştiririm ve çöktüğünde yaptığım her şeyi yeniden çalıştırıp yaparım.

Düzenleme: "Amaç-C istisnalarına" ayarlamak, açıkça bunun nasıl yapılacağıdır. Yukarıdaki cevaba bakın!


9

İşte bu hatayı nasıl düzelttiğimi gösteren bir ekran görüntüsü. Bunun yukarıdaki cevapların bahsettiği yolla aynı olup olmadığından emin değilim, ancak benzer olduğunu varsayıyorum.

  1. Xcode'da Kesme Noktası gezginine gidin.
  2. 'Tüm İstisnalar' satırına Control tuşuyla tıklayın.
  3. 'Kesme Noktasını Düzenle ...' seçeneğini seçin.
  4. Değişim Exceptiongelen Alletmek Objective-C.

görüntü açıklamasını buraya girin


2

Geri izleme çok yardımcı oldu, teşekkürler !. Geçenlerde aynı sorunla karşılaşmaya başlamıştık. Ortaya çıkardığı mp3 dosyalarının geçerli bir ID3 etiketi olmadığı ve bunları Tagr gibi bir uygulama aracılığıyla çalıştırmanın onları hemen düzelttiği ortaya çıktı!


1
ID3 etiketinde eksik alanları ayarladıktan sonra, uygulama artık AVAudioPlayer başlatılırken durmadı, ancak yine de oynatma talimatında durdu ...
Reinhard Männer

Hangi alanlar zorunluydu? Hepsi?
reggian

@Reggian Hatırlamıyorum, çok uzun zaman önceydi. Bunun için üzgünüm! Eksik olan alanları eklemem gerektiğini hatırlamıyorum, doğru hatırlıyorsam sadece bir etiket dezenfektanı ile çalıştırmak yeterliydi!
yo.ian.g

2

Xcode 9.2'de belirli istisnaları gördükten sonra devre dışı bırakabilirsiniz. Kesme noktaları menüsünü açın ve devre dışı bırakmak için tıklayın (soluk ok)

görüntü açıklamasını buraya girin


-4

AVAudioPlayer'ı bir sınıf Değişkeni olarak ayarlamayı deneyin!


1
Benim durumumda, AVAudioPlayer'ı bir sınıf değişkeni olarak zaten kurdum ve hala çalışmıyor. Çözümü gerçekten bilmiyormuşsunuz gibi görünüyor
Alex Cio
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.