`
zcw_java
  • 浏览: 303752 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

NSTimer

 
阅读更多
启动 Timer
– fire
停止 Timer
– invalidate
Timer设置
– isValid
– fireDate
– setFireDate:
– timeInterval
– userInfo


self.m_timerTimeOut = [NSTimer scheduledTimerWithTimeInterval:1.0
                                                           target:self
                                                         selector:@selector(handleTimeOutAction)
                                                         userInfo:nil repeats:YES];

第一个参数,1.0代表1秒,如果该值<0,系统会默认为0.1
第二个参数, target:(id)aTarget,表示发送的对象,如self
第三个参数,selector:(SEL)aSelector方法选择器,在时间间隔内,选择调用一个实例方法
第四个参数,userInfo:(id)userInfo此参数可以为nil,当定时器失效时,由你指定的对象保留和释放该定时器。
第五个参数,repeats:(BOOL)yesOrNo当YES时,定时器会不断循环直至失效或被释放,当NO时,定时器会循环发送一次就失效。

例如:
if ([m_timerTimeOut isValid])
    {
        [m_timerTimeOut invalidate];
        m_timerTimeOut = nil;
    }
//把定时器添加到当前runloop中,用于解决在定时器启动时,其他的手势操作对定时器的影响
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

检查状态,如果是开始状态,那么制空m_timerTimeOut这个Timer,如果你问我为何设个nil,因为这样可以保证这个timer马上为nil,哈哈~安全起见,保证一个timer在跑
NSRunLoop这里建议添加此句,因为有一种情况是一个UILable用来显示时间,其又在一个UIView上,如果现在view接收手势滑动等事件,此时timer会停止几秒,造成不良影响





invalidate和release内存问题转自 冷冰雨之家
iphone NSTimer invalidate 和 release 释放问题
最近在使用NSTimer的时候,遇到了一些内存错误的问题,找了一片很好的文章可惜是英文的,现自己翻译出来,以备后用。
原文:
[timer release] only needs to be called if you “own” the timer. From Apple’s documentation:
Because the run loop maintains the timer, from the perspective of memory management there’s typically no need to keep a reference to a timer once you’ve scheduled it. Since the timer is passed as an argument when you specify its method as a selector, you can invalidate a repeating timer when appropriate within that method. In many situations, however, you also want the option of invalidating the timer—perhaps even before it starts. In this case, you do need to keep a reference to the timer, so that you can send it an invalidate message whenever is appropriate. If you create an unscheduled timer (see “Unscheduled Timers”), then you must maintain a strong reference to the timer (in a reference-counted environment, you retain it) so that it is not deallocated before you use it.
What does this mean?
If you alloc and init a timer, you must also release it, like so:
NSTimer * timer = [[NSTimer alloc] initWith…];
NSRunLoop * runLoop = [NSRunLoop currentRunLoop];

[runLoop addTimer:timer forMode:NSDefaultRunLoopMode];

[timer release];
……
[timer invalidate];

timer = nil;

Once the timer has been added to the run loop, there is no reason to keep a reference to it anymore, since the run loops owns it. In this case, as shown, you would release the timer as soon as you add it to the run loop, and then simplyinvalidate it when you are finished. The final line (setting timer to nil) is for safety. The call to invalidate will result in the timer being released (by the run loop), so it is unsafe to keep a reference that points to it. Setting the local reference to nil keeps things kosher.
If, however, you create a timer using one of the convenience methods like so:
NSTimer * timer = [NSTimer scheduledTimerWithTimeInterval ...];

You do not need to call [timer release] at all!

The convenience method adds the timer to the run loop, which then owns it, so you do not need to perform any memory management on the returned timer object. You would simplyinvalidate the timer when you no longer want to use it:
[timer invalidate];timer = nil;

Or, if the timer was not set to repeat, you would do absolutely nothing at all, since it would be released after its first invocation.

译文:[timer release]这个方法只有在当你拥有timer的时候才可以调用。根据Apple的文档描述如下:由于RunLoop保持着timer。从内存管理的角度上看,当我们scheduled(预定)一个timer的时候,我们通常是不需要保持它的reference(引用计数)的。由于timer是作为一个参数传递的,timer的指定的方法是selector的形式,所以你可以在指定的方法的内部,在合适的时候invalidate一个重复的timer(repeating timer)。然而,在许多的场合下,你可能会想在timer开始之前就invalidating timer。在这种情况下,又必须保持一个对timer的引用(reference),以便于你可以合适的时间向timer发送invalidate消息。如果你创建了一个 unscheduled timer,你必须保持一个对于这个timer的 strong reference(在 reference_count(引用计数的环境下),你给timer发送了一个retain的消息),n这样做目的是保证在你使用该timer之前,它不会被deallocated。简言之:如果你allloc init了一个timer,你必须release it,例如:
NSTimer * timer = [[NSTimer alloc] initWith…];
NSRunLoop * runLoop = [NSRunLoop currentRunLoop];
[runLoop addTimer:timer forMode:NSDefaultRunLoopMode];
[timer release];
……
[timer invalidate];
timer = nil;
一旦timer被加入了Runloop,我们就没有任何原因来保持一个引用,因为Runloop会保持它。在这个展示中,正如我们我展示的,你应该release 掉它,当你把它添加进Runloop的时候,并且像示例中的那样在timer结束的时候 invalidate 。最后一行代码(timer = nil)是为了安全。invalidate 的调用会使得timer被release(由Runloop控制),所以保持一个指向timer的引用是不安全。将本地的引用设置为空是符合规则的。
无论如何,如果你创建一个timer按照下面的这种形式:
NSTimer * timer = [NSTimer scheduledTimerWithTimeInterval ...];
你根本不需要 调用 [timer release]!
这个便捷的方法,把timer加入到了Runloop,Runloop会保持timer的引用计数,所以你不需要在返回的timer对象上实现任何的
内存管理。你应该想示例的那样invalidate timer,如下:
[timer invalidate];timer = nil;
或者,如果timer没有设置重复(repeat),你就安心的不需要做任何的事情,因为他会在第一次调用完成后release timer。
分享到:
评论

相关推荐

    简单的时间选择器Nstimer

    `NSTimer`是苹果iOS和macOS开发中的一个核心组件,用于执行周期性的任务或者在特定时间点触发某个动作。这个“简单的时间选择器Nstimer”是一个实用工具,它提供了一个用户界面来控制`NSTimer`,允许用户进行暂停、...

    ios 时间定时器 NSTimer应用demo

    在iOS开发中,`NSTimer`是一个非常重要的类,它允许开发者在指定的时间间隔后执行某段代码,或者定期重复执行某任务。本教程将基于"ios 时间定时器 NSTimer应用demo",深入探讨`NSTimer`的使用方法、工作原理以及...

    NSTimer在tableView上的复用

    在iOS开发中,`NSTimer` 是一个常用的类,用于执行周期性的任务。然而,在复杂的视图控制器,如 `UITableView` 中使用 `NSTimer`,可能会遇到一些挑战,特别是涉及到对象复用的情况。本篇文章将深入探讨 `NSTimer` ...

    NSTimer实现的小计时器

    在iOS开发中,`NSTimer`是一个常用的工具,用于在特定的时间间隔执行某项操作。本文将深入探讨`NSTimer`的使用,特别是在创建小计时器时的两种类方法,以及它们如何受到屏幕滚动事件的影响及解决方案。 一、NSTimer...

    ios计时器NSTimer的使用

    在iOS开发中,`NSTimer` 是一个非常重要的类,用于在特定的时间间隔后执行某个操作,例如倒计时或定期更新UI。本教程将深入探讨`NSTimer`的使用,包括如何创建、启动、暂停以及取消定时器,并通过一个倒计时10秒的...

    深入理解CADisplayLink和NSTimer

    CADisplayLink与NSTimer都是用于在iOS开发中设置定时任务的重要工具,但它们各自的使用场景、工作原理以及优缺点都有所不同。 CADisplayLink是一个定时器对象,它将操作与显示器的刷新周期同步。这意味着,每当...

    深入理解CADisplayLink和NSTimer-Epub

    详细讲解CADisplayLink和NSTimer的区别。

    NSTimer定时器

    在iOS和macOS开发中,`NSTimer`是苹果提供的一种强大的工具,用于在特定时间间隔后执行某个操作。它是Foundation框架的一部分,适用于Objective-C和Swift开发者。`NSTimer`可以让你的应用程序按照预设的时间间隔执行...

    ios-高精度高定制化可代替系统NSTimer的脉冲式计时器 --- MKImpulse.zip

    MKImpulse是一个用来代替系统NSTimer的高精度脉冲器 系统的NSTimer是添加到Runloop中的, 在系统繁忙时会造成偏差, 时间越长, 偏差越大 而MKImpulse是基于GCD编写的脉冲器, 精度由CPU时钟进行计算, 误差基本可以...

    NSTimer-Blocks, 在NSTimer上提供块功能,简单分类.zip

    NSTimer-Blocks, 在NSTimer上提供块功能,简单分类 自述文件NSTimer上非常简单的类别,它可以使用块。工作原理我认为如果你使用的是一个块,你可以能不需要将任何用户指定的对象传递到计时器。 你只要从街区里得到你...

    iOS NSTimer循环引用的办法

    iOS NSTimer循环引用的解决方案 iOS 开发中,NSTimer 循环引用的问题是一个常见的问题。NSTimer 在创建时,会对 target 进行强引用,直到定时器作废。这样就会导致 NSTimer 和 target 之间形成循环引用,无法释放...

    NSTimer 使用 文档说明

    ### NSTimer 使用 文档说明详解 #### 一、前言 在iOS开发中,`NSTimer`是一个非常实用且常见的类,它可以帮助开发者实现定时任务的功能。本文将深入解析`NSTimer`的使用方法,包括如何创建定时器、设置定时器的...

    ios UIScrollView PageControl NSTimer

    在这个项目中,我们关注的是如何利用`UIScrollView`与`UIPageControl`以及`NSTimer`来实现一个自动循环滑动的效果。下面我们将详细探讨这些知识点。 1. **UIScrollView 循环滑动** 在`UIScrollView`中实现循环滑动...

    IOS应用源码——nstimer.zip

    在iOS应用开发中,NSTimer是一个非常重要的组件,它允许开发者在特定的时间间隔执行特定的任务。这个"IOS应用源码——nstimer.zip"文件显然包含了关于如何在iOS应用中使用NSTimer的源代码示例。NSTimer是Foundation...

    iOS 中的 NSTimer.pdf

    在iOS开发中,`NSTimer`是一个常用组件,用于实现定时任务。`NSTimer`的工作原理是将其添加到RunLoop中,由RunLoop来管理和触发。在本文中,我们将深入探讨`NSTimer`的使用、生命周期以及避免内存泄漏的方法。 首先...

    swift-常见NSTimer的消毁方法用一种优雅的方式销毁NSTimer

    在Swift编程中,`NSTimer`是一个非常常用的定时器类,用于执行周期性的任务。然而,如果不正确地管理,`NSTimer`可能会导致内存泄漏,因为它会在后台保持对目标对象的强引用,即使该对象已经不再需要。因此,正确地...

    ios-NStimer.zip

    在iOS开发中,`NSTimer` 是一个非常重要的类,用于在特定的时间间隔执行重复或单次的任务。在这个场景中,我们看到标题提及了“ios-NStimer.zip”,这很可能是一个示例项目或者代码片段,它展示了如何使用`NSTimer`...

    UIScrollView + UIPageControl +NSTimer 做循环播放View

    配合 `UIPageControl` 和 `NSTimer`,我们可以实现类似轮播图的效果,即循环播放多个视图。这个项目可能是一个简单的教程,通过 `UIScrollView` 实现图片或内容的自动切换,并通过 `UIPageControl` 显示当前所在的...

    Swift:UIProgressView+NSTimer+UIstepper

    在Swift编程中,UIProgressView、NSTimer和UIStepper是三个重要的UI组件,它们各自在用户界面交互中扮演着不同的角色。这篇文章将深入探讨如何将这三个组件结合使用,为iOS应用创建动态的进度条更新功能。 首先,...

Global site tag (gtag.js) - Google Analytics