gpt4 book ai didi

crash - NSTimer 错误访问

转载 作者:行者123 更新时间:2023-12-03 15:57:16 28 4
gpt4 key购买 nike

我正在尝试创建一个 NSTimer,然后使其无效并释放它,然后将其设置为新的计时器。但是,在尝试再次设置计时器成员 var 时,我得到了 EXC_BAD_ACCESS。

下面的代码:

1)我设置了定时器成员变量(它设置为保留)

self.mPageTimer = [NSTimer scheduledTimerWithTimeInterval:kPageTimerInterval target:self selector:@selector(pageTimerCallback) userInfo:nil repeats:NO];

2)我放手了
    [mPageTimer invalidate];
[mPageTimer release];

当我再次尝试在步骤 1 中调用代码段时,这会导致崩溃,但我不知道为什么。我通过设置保留它,然后释放它,所以不应该照顾对象并且我的成员 var ok 设置为新分配的计时器吗?

如果我这样做,它不会崩溃并且工作正常:
    [mPageTimer invalidate];
[mPageTimer release];
mPageTimer = nil;

我看不出我在释放对象时做错了什么,因为无论是否是这种情况,我不应该总是将我的成员 var 设置为任何新创建的 nstimer,是否泄漏?

最佳答案

是否可以安全地假设,...

  • 片段 2) 不是来自 @property 的 setter ,但来自另一种方法
  • 简单 @synthesize mPageTimer
  • 计时器的声明是 @property (nonatomic, retain) NSTimer* mPageTimer ?
    (非原子还是原子都无所谓)

  • 如果是这样的话 ,预计您的崩溃:
    create timer (timer retains you, timer is autoreleased!)
    schedule timer (runloop retains the timer)
    assignment through setter (you retain the timer)
    ... (time passes)
    has it fired?
    Yes:
    since your timer is non-recurring, the runloop has marked it
    as invalid and released it after invocation of "pageTimerCallback:"
    calling "invalidate":
    has it fired?
    No:
    runloop unschedules and releases
    Yes:
    noop or release (read: "I don't know and admittedly don't care")
    calling "release" (you are no longer the owner)
    ... (time passes)
    assignment through synthesized setter:
    [newTimer retain];
    [oldTimer release]; // Crash due to overrelease!

    简而言之:
    如果 你有一个计时器的属性, 提供你自己的 setter 并让每个访问都使用它 .
    (允许两个异常(exception):1. setter 的实现 2. 在你 release 计时器* 的 dealloc 中

    (* 不要使您在 dealloc 中成为目标的计时器无效: It is absolutely pointless!)

    关于crash - NSTimer 错误访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5025722/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com