Çapraz Platform Uygulamada Bellek Sızıntısı: Listener ve Subscription Temizliği

Mobil uygulamalarda bellek sızıntısı çoğu zaman listener ve subscription'lar temizlenmediği için oluşur. Bir component/widget yok olurken arka planda hala event dinliyor olması, sistemin o listener'ı serbest bırakmasını engeller. Zaman içinde bu birikimler cihazı yavaşlatır, crash'e yol açar.

Flutter'da StreamSubscription kullanırken dispose() metodu içinde subscription'ı iptal etmen gerekir. Bunu yapmaz isen, widget silinse bile stream dinlemeye devam eder.

1class MyWidget extends StatefulWidget {
2@override
3State<MyWidget> createState() => _MyWidgetState();
4}
5
6class _MyWidgetState extends State<MyWidget> {
7late StreamSubscription _subscription;
8
9@override
10void initState() {
11super.initState();
12_subscription = myStream.listen((data) {
13print('Veri geldi: $data');
14});
15}
16
17@override
18void dispose() {
19_subscription.cancel(); // Mutlaka temizle
20super.dispose();
21}
22
23@override
24Widget build(BuildContext context) {
25return Container();
26}
27}

React Native'de ise useEffect hook'unun return fonksiyonunda listener'ı kaldırmalısın. Event emitter'dan subscribe ederken, component unmount olduğunda subscription'ı temizle.

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1import { useEffect } from 'react';
2import { NativeEventEmitter } from 'react-native';
3
4const MyComponent = () => {
5useEffect(() => {
6const emitter = new NativeEventEmitter();
7const subscription = emitter.addListener('myEvent', (data) => {
8console.log('Olay: ', data);
9});
10
11// Cleanup fonksiyonu
12return () => {
13subscription.remove(); // Temizle
14};
15}, []);
16
17return null;
18};

Bir başka yaygın hata, setTimeout veya setInterval'ı temizlemektir. Eğer bir timer başlatıp component silinirse, timer arka planda çalışmaya devam eder.

1useEffect(() => {
2const timer = setInterval(() => {
3console.log('Çalışıyor');
4}, 1000);
5
6return () => clearInterval(timer); // Timer'ı durdur
7}, []);

Kullanıcı ekran değiştirdiğinde ya da app kapandığında, tüm listener'lar ve subscription'lar otomatik silinmez. Sen el ile temizlemen gerekir. Bunu yapmak alışkanlık haline getir: her initState/useEffect için bir dispose/cleanup yaz. Böylece bellek sızıntısından uzak kalırsın.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz