如何在 AppleScriptObjC 中使用 NSAutoreleasePool

Posted

技术标签:

【中文标题】如何在 AppleScriptObjC 中使用 NSAutoreleasePool【英文标题】:How to use NSAutoreleasePool in AppleScriptObjC 【发布时间】:2013-08-13 03:01:31 【问题描述】:

我想知道如何从后台函数中停止另一个函数。 另外,我还要排干NSAutoreleasePool,但是不知道怎么做。 如果我不释放池,我认为这个应用程序有时会冻结。

property i : 0
property myLabel : missing value

on myStartButtonHandler_(sender)
    my performSelectorInBackground_withObject_("start", missing value) -- This code prevents "Stop" Button from freezing.
end myStartButtonHandler_

on myStopButtonHandler_(sender)
    -- I want to stop start() function and drain AutoreleasePool!
    -- I don't want to use "quit me" because I want to stop only start() function.
end myStopButtonHandler_

on start()
    repeat
        set i to i + 1
        myLabel's setIntegerValue_(i)
        delay 1
    end repeat
end start

你可以从这里下载源代码 --> https://dl.dropboxusercontent.com/u/97497395/test2.zip 供您参考,我使用的是 Xcode 4.6.3。编辑 我的脚本有delay 300 命令,所以我无法通过检查变量的值来停止函数。对不起。 编辑 我想到了在延迟命令时停止该功能的想法。

on start()
    repeat 5 times
        if i = 1 then
            error -128
        else
            delay 60
    end repeat
end start
on myStopButtonHandler_(sender)
    set i to 1
end myStopButtonHandler_

我可以在 60 秒内停止该功能,但我无法在按下停止按钮后立即停止。所以,我还在等你的答复。

【问题讨论】:

【参考方案1】:

停止函数的一种简单方法是使用变量。检查变量的值。例如,如果变量为真,那么您可以退出重复循环并排空自动释放池。我现在正在上班,所以没有时间写代码。祝你好运。

编辑:如果您使用 NSTimer 来触发您的处理程序,而不是重复循环,那么您可以使计时器无效以阻止它运行处理程序。我使用它来使计时器无效,因为您应该始终在使计时器无效之前检查计时器是否有效……如果您使无效计时器无效,它将崩溃。

-(void)deleteMyTimer 
    if ([myTimer isValid]) 
        [myTimer invalidate]
        myTimer = nil;
    

【讨论】:

谢谢,但我的脚本(不是测试)有delay 300,我无法检查“延迟”中变量的值。我想在按下停止按钮后立即停止该功能。如何停止“延迟”命令中的功能? Josh 说“你应该使用 NSTimer,而不是延迟,它会在触发时调用下一个函数”,但我不知道如何检查 NSTimer 中变量的值。跨度> 如果您使用 NSTimer 而不是重复循环,这是一个非常好的主意,那么您可以使计时器无效,它会阻止计时器触发,从而停止您的处理程序运行。所以这就是你想要的。您不需要变量,因为您将直接使计时器无效。我通常使用一种方法使计时器无效...我在帖子的编辑部分发布了该代码。 谢谢,但我的项目仍在使用performSelectorInBackground_withObject_ 运行。因此,我不会将延迟更改为 NSTimer,以免产生错误。 那么我的原始评论适用。您需要在延迟之后添加变量检查。例如...如果 shouldStop 然后退出重复。然后在您的主线程中,在启动后台线程之前将变量设置为 false,当您想退出后台线程时,您从主线程将 shouldStop 设置为 true。当延迟结束时,重复循环将停止。只要后台线程在您想要退出它的延迟之后不做任何事情,它是否立即退出并不重要。有意义吗?

以上是关于如何在 AppleScriptObjC 中使用 NSAutoreleasePool的主要内容,如果未能解决你的问题,请参考以下文章

使用 Core Graphics 使用 AppleScriptObjC 更改图像色彩空间配置文件

如何在 Python 中使用正则表达式将所有内容匹配到双换行符“\n\n”?

如何在matlab中连接数组'n'时间?

如何在 flex 4 的 mx:TextArea 的文本属性中使用 '\n'?

如何在 .NET C# 中使用编写 N 进行插入查询?

如何在示例应用程序中使用 N 个视图进行本机反应