React Native应用在发布模式下崩溃,但在调试模式下正常运行

4

我正在开发一款React Native应用程序,适用于iOS。该应用程序在模拟器上运行良好。我尝试在iPad上测试该应用程序,在调试模式下它可以正常工作,但是当我在iPad上以发布模式运行应用程序时,在点击按钮时会出现异常。异常信息为:

Terminating app due to uncaught exception 'RCTFatalException: Exception '-[__NSCFNumber length]: unrecognized selector sent to instance 0x94fbee52df959691' was thrown while invoking multiSet on target RNCAsyncStorage with params (
    (
            (
        "@TOS:deletedProjects",
        1864
    )
),
2573

导致此异常的代码是:
let projects = JSON.parse(await AsyncStorage.getItem('@TOS:projects'));
     console.log('projects', projects);
     let index = projects.findIndex(x => x.p_id === project.p_id);
     console.log(projects, index);
     projects.splice(index , 1);
     console.log('projects', projects);
     await AsyncStorage.setItem('@TOS:projects', JSON.stringify(projects));
     // await AsyncStorage.setItem('@TOS:deletedProjects', JSON.stringify(project.p_id));

        let deletedProjects = await AsyncStorage.getItem('@TOS:deletedProjects')
        console.log("********** " + deletedProjects);
          if(deletedProjects !== '' && deletedProjects !== null && deletedProjects !== undefined){
            console.log('if have deleted projects');
            let combined = '"' + deletedProjects + '"' + ',' + '"' + project.p_id + '"';
             console.log('combined', combined);
             await AsyncStorage.setItem('@TOS:deletedProjects', combined);
          }else{
            console.log('if no deleted projects');

            await AsyncStorage.setItem('@TOS:deletedProjects', project.p_id);

          }

     console.log('in success');

我不明白应用程序为什么会崩溃,因为在调试模式下它完全正常运行。


我在Android上遇到了类似的问题。我注意到调试版本和发布版本之间唯一的区别是捆绑代码的最小化。在构建一个没有最小化代码的发布版后,一切都正常工作了。请参考https://github.com/facebook/react-native/issues/9711。 - Daniel Gabor
我已经通过将int转换为string来解决了这个问题,即“await AsyncStorage.setItem('@TOS:deletedProjects',project.p_id.toString());”,但我仍然不知道确切的问题是什么,以及为什么在调试模式下运行。 - Waleed Naveed
调试和生产环境的主要区别在于,在调试环境中,您的JavaScript运行在Chrome中,而在生产环境中,它则在JavascriptCore中运行。 - Kirill
是的,那很酷,但在调试模式下我可以使用int运行,但在发布模式下我必须将该int转换为字符串,这对我来说毫无意义 @Kirill - Waleed Naveed
1个回答

2

重申一下@Waleed在他的评论中提到的内容。为了解决这个问题,您需要确保只向AsyncStorage.setItem()传递字符串。

我无法解释为什么这个错误只会在iOS发布版本中出现。我还测试了一个Android发布版本,当我传递一个整数时它可以正常工作。


是 @Bob,你说得对,但我仍然不明白为什么此代码在调试模式下可以运行而发布模式却不能。 - Waleed Naveed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接