我目前正在测试允许应用程序的用户在应用程序内(使用JavaScriptCore)创建脚本/插件的功能。例如,这些插件允许它们调用对象和呈现视图控制器。问题在于,用户可能会犯一个错误,导致异常被抛出,例如,如果他们发送了一个对象没有响应的消息,或者试图呈现一个已经处于活动状态的视图控制器。
到目前为止,我一直在考虑使用NSSetUncaughtExceptionHandler捕获应用程序中的所有异常,我的想法是将脚本/插件的执行隔离在一个单独的线程中,然后在发生异常时使用[NSThread exit]退出该线程,从而防止应用程序完全崩溃。这样做的问题有两个,首先,提前退出线程会导致分配的所有对象的内存泄漏,并且在此之前不会释放;其次,与UI相关的任何内容都不能在单独的线程上处理。
除了需要防止由于脚本/插件导致的崩溃之外,还需要能够在需要时终止脚本(这可能是一个完全独立的问题本身),例如一个停止按钮。这将终止任何设置的计时器,例如,我相信让插件在单独的线程上运行也会像它们在单独的run循环中一样处理这个问题。
诚然,这远不是理想的情况,如果这是在OS上,那么我的第一个想法是产生一个沙箱子进程并利用XPC。然而,不幸的是,人们无法在iOS上享受到这种奢侈。
任何关于这个问题的想法/建议都将不胜感激。
发布于 2015-02-11 10:50:45
为了在“安全”的环境中测试你的脚本,你可以继承NSOperation类并在自定义的主函数中执行你的脚本。在NSOperation子类中,您需要实现start方法,并从@try @catch块调用主
-(void)start {
@try {
[self main];
}
@catch (NSException *exception) {
NSLog(@"Exception was raised");
}
}
-(void)main {
// Perform script here
}最后,您需要将此操作添加到主操作队列中
[[NSOperationQueue mainQueue] addOperation:[MyScriptOperation new]];因此,您的脚本将在主线程上运行,您将能够执行UI操作。
此外,通过其他配置,您还可以手动运行和取消此操作。您可以找到有关NSOperation子类化和实现细节here的更多详细信息。
https://stackoverflow.com/questions/28355751
复制相似问题