Ç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@override3State<MyWidget> createState() => _MyWidgetState();4}56class _MyWidgetState extends State<MyWidget> {7late StreamSubscription _subscription;89@override10void initState() {11super.initState();12_subscription = myStream.listen((data) {13print('Veri geldi: $data');14});15}1617@override18void dispose() {19_subscription.cancel(); // Mutlaka temizle20super.dispose();21}2223@override24Widget 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.
1import { useEffect } from 'react';2import { NativeEventEmitter } from 'react-native';34const MyComponent = () => {5useEffect(() => {6const emitter = new NativeEventEmitter();7const subscription = emitter.addListener('myEvent', (data) => {8console.log('Olay: ', data);9});1011// Cleanup fonksiyonu12return () => {13subscription.remove(); // Temizle14};15}, []);1617return 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);56return () => clearInterval(timer); // Timer'ı durdur7}, []);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.
0 yorum