【问题标题】:should I release NSTimer if it has a repeats attribute equal to YES?如果 NSTimer 的重复属性等于 YES,我应该释放它吗?
【发布时间】:2011-07-21 16:28:22
【问题描述】:

有时我对何时不释放对象感到困惑。我有:

NSTimer *timer2;

timer2 = [NSTimer scheduledTimerWithTimeInterval: (5)
                                         target: self
                                       selector: @selector(someMethod:)
                                       userInfo: nil
                                        repeats: YES];

每五秒执行一次的方法是:

-(void) someMethod:(NSTimer*)theTimer
{
   NSLog(@"code got executed");
}

我有另一种方法可以在我的根视图控制器上放置另一个 nib 文件:

ViewControllerObjetivos *control = [ViewControllerObjetivos alloc];

[control initWithNibName:@"ViewControllerObjetivos" bundle:nil];

UINavigationController *navControl = [[UINavigationController alloc]
                                      initWithRootViewController:control];

[self presentModalViewController:navControl animated:NO]; 
[navControl setNavigationBarHidden:YES];

[control release];
[navControl release];

当我调用最后一个方法时,会在根视图控制器上放置一个新的 nib 文件。并且 someMethod 仍然被调用!

所以我很困惑是否应该释放 timer2,因为我没有使用 init 或 alloc 一词,也没有使用 copy 来初始化它。那我该怎么办?我应该停止它然后调用我显示的最后一个方法吗?或者我应该发布整个 nib 文件,因为我将使用一个新文件?

【问题讨论】:

    标签: iphone objective-c ios cocoa-touch release


    【解决方案1】:

    停止计时器的正确方法是调用其invalidate 方法。

    无效

    阻止接收器再次触发并请求将其从运行循环中移除。

    在您的情况下,您可以将 timer2 存储在您班级的 ivar 中,然后在适当的时候发送它 invalidate,即当您显示第二个笔尖时(如果我没记错的话)。如您所见,不这样做会使计时器永远运行。

    如果将repeats设置为NO,则定时器在第一次触发后会自动失效:

    重复

    如果是,计时器将反复重新安排自己直到失效。如果否,定时器在触发后将失效。

    【讨论】:

    • Sergio 如果我将 autorepeat 属性设置为 NO,我还需要调用 invalidate 方法吗?
    【解决方案2】:

    NSTimer 的 scheduleTimerWithTimeInterval 返回一个它拥有的对象,所以你不需要保留它。如果以后需要使其失效(停止),您应该自己保留它。

    【讨论】:

    • 它不返回自动释放的对象;它返回一个你不拥有的对象。
    猜你喜欢
    • 2017-03-31
    • 1970-01-01
    • 2011-03-21
    • 2017-04-01
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 2011-05-26
    • 2016-03-10
    相关资源
    最近更新 更多