2014-04-05 27 views
7

Rastgele bir EXC_BAD_ACCESS KERN_INVALID_ADDRESS yaşıyorum, ancak kaynağı işaret edemiyorum. Ancak, ben merak ediyorum bu olabilir eğer:dealloc içinde dispatch_async güvenli midir?

Bir audio_queue böyle yarattık:

dispatch_async(_audio_queue, ^{ 
    _audioPlayer = [[AudioPlayer alloc] init]; 
}); 

: Ben oluşturmak ve bir nesne _audioPlayer denilen erişmek için kullandığınız

_audio_queue = dispatch_queue_create("AudioQueue", nil); 

ses oyuncusu MovieView aittir:

@implementation MovieView 
{ 
    AudioPlayer *_audioPlayer 
} 

Daha sonra, MovieView arasında dealloc yöntemde, sahip:

- (void)dealloc 
{ 
    dispatch_async(_audio_queue, ^{ 
     [_audioPlayer destroy]; 
    }); 
} 

bu kabul edilebilir mi? Ben bloğun çağrıldığı zaman, MovieView zaten ayrılmış olduğunu ve _audioPlayer erişmeye çalışırken, artık yok olduğunu düşünüyorum. Bu dava mı?

Benim çökme raporu sadece diyor ki:

MovieView.m line 0 
__destroy_helper_block_ 
+0

"_audioPlayer" uygulamasının hala var olup olmadığını görmek için bu noktaya bir kesme noktası koydunuz mu? – Dima

+0

Kazaları sürekli olarak çoğaltamıyorum. Şu anda orada bir kesme noktası koyarsam, evet, '_audioPlayer' hala var. – Snowman

+0

Hatalı erişimin gerçekleştiği bir satır numaranız var mı? – Dima

cevap

11

Sizin hata olduğunu test etmedim

- (void)dealloc 
{ 
    dispatch_sync(_audio_queue, ^{ 
     [_audioPlayer stopPlaying]; 
    }); 
} 

dispatch_sync kullanabilirsiniz Ivar erişim. Yukarıdaki -dealloc

- (void)dealloc 
{ 
    dispatch_async(self->_audio_queue, ^{ 
    [self->_audioPlayer stopPlaying]; 
    }); 
} 

bunu dealloced sonra self kullanarak sonuna çünkü bu kırabilir eşdeğerdir: Bu Ivars objc nasıl çalıştığını kaynaklanmaktadır.

düzeltmedir

- (void)dealloc 
{ 
    AVAudioPlayer * audioPlayer = _audioPlayer; 
    dispatch_async(audio_queue, ^{ 
    [audioPlayer stopPlaying]; 
    }); 
} 

gibi bir şey (sıklıkla evreli değil açıkça veya dolaylı (. Ne yazık ki, sanmıyorum bir blok referans self) Ivars aracılığıyla bir uyarı var olan this.)

+0

Yerel değişken neden önerilen düzeltmede '__weak' değil? – Snowman

+3

Zayıf değil çünkü o zaman blok çalıştırılmadan önce ayrılmış olabilir ve daha sonra 'audioPlayer 'nesnesi hiçbir zaman' stopPlaying 'mesajını alamaz. –

+0

@moby Neden bu zayıf olmalı? Ayrılmamış olmakla ilgili değildir ve (muhtemelen) bir iş parçacığı için güvenli olmayan bir nesne değildir. –

-2

bu neden ise, bu

+0

neden downvote? –

+0

Bu, hala bloğu ve dolayısıyla kendinden başka bir iş parçacığına yapılan başvuruyu dolaylı olarak iletir. Bunun güvenli olduğuna dair bir garanti yoktur. 'If ​​(zayıfAudioPlayer! = Nil)' için de kontrol gereksizdir ve eğer gerekliyse güvensiz olacaktır. –

+0

Sanırım blokta yakalanan tek değişken zayıf değişken. –

İlgili konular