如何避免本机反应中的内存泄漏?

Posted

技术标签:

【中文标题】如何避免本机反应中的内存泄漏?【英文标题】:How to avoid memory leak in react native? 【发布时间】:2022-01-13 04:14:38 【问题描述】:

我正在尝试处理本机反应中的内存泄漏。 我已经学习了很多教程,但无济于事。

这是我的原始代码

useEffect(() => 
        const unsubscribe = navigation.addListener('focus', () => 
            setLoading(true);
            async function fetchData() 
                try 
                    await dispatch(fetchProductComment(itemNum, ''));
                    await dispatch(fetchMultiBuy(itemNum, 'SIZES'));
                    ...
                 catch (err) 
                    console.log(err);
                 finally 
                    setLoading(false);
                
            

            fetchData();
        );
        return unsubscribe;
    , [navigation]);

查看教程后,我尝试了Boolean Flag 方法和Abort Controller 方法以避免内存泄漏。但这些都不起作用。

***ABORT CONTROLLER METHOD***

useEffect(() => 
        let abortController = new AbortController();
        const unsubscribe = navigation.addListener('focus', () => 
            setLoading(true);
            async function fetchData() 
                ...
            
            fetchData();
        );

        return () => 
            abortController.abort;
            unsubscribe;
        ;
    , [navigation]);



***BOOLEAN METHOD***

 useEffect(() => 
        let componentMounted = true;
        const unsubscribe = navigation.addListener('focus', () => 
            setLoading(true);
            async function fetchData() 
                ...
            
            fetchData();
        );
    
        return () => 
            componentMounted = false;
            unsubscribe;
        ;
    , [navigation]);

这些不起作用。有什么想法吗?

【问题讨论】:

【参考方案1】:

我也有同样的问题。如果它仍然显示内存泄漏,请你试试这个并评论。

我正在跟进这个问题。

 useEffect(() => 
          const controller = new AbortController();
          const  signal  = controller.signal;      
          (async () => 
            const response = await fetch(API_KEY, signal);
              const news = await response.json();
                setNews(news.articles); // fetched JSON
            
          )();
          
          return () => controller.abort();
        ,[API_KEY])

【讨论】:

以上是关于如何避免本机反应中的内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Malloc Debug 来检查本机内存泄漏?

避免、发现和消除 Cocoa 中的内存泄漏

如何在 JVM 上调试本机内存中的泄漏?

如何防止java中的内存泄漏

如何避免内部类中的内存泄漏

c++ 内存泄漏问题