1

我想知道如何从后台函数中停止另一个函数。
另外,我还要排干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 秒内停止该功能,但我无法在按下停止按钮时立即停止它。所以,我还在等你的答复。

4

1 回答 1

0

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

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

-(void)deleteMyTimer {
    if ([myTimer isValid]) {
        [myTimer invalidate]
        myTimer = nil;
    }
}
于 2013-08-13T05:06:34.420 回答