- 浏览: 303752 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
yahier:
没帮助。。。。。。
利用JS获取经纬度,定位html地图 -
mountainol:
[img][img][img][img][url][flash ...
iPhone面试题解答,真机调试 -
qww_friend:
很不错的一个案例,试了下,没有报错,就是我想要的
Poi读取Excel2007 -
zcw_java:
peng051410 写道啥时候能更新呢?求解! 好久没弄过了 ...
Spring Security-session过期跳出<iframe> -
peng051410:
啥时候能更新呢?求解!
Spring Security-session过期跳出<iframe>
启动 Timer
– fire
停止 Timer
– invalidate
Timer设置
– isValid
– fireDate
– setFireDate:
– timeInterval
– userInfo
第一个参数,1.0代表1秒,如果该值<0,系统会默认为0.1
第二个参数, target:(id)aTarget,表示发送的对象,如self
第三个参数,selector:(SEL)aSelector方法选择器,在时间间隔内,选择调用一个实例方法
第四个参数,userInfo:(id)userInfo此参数可以为nil,当定时器失效时,由你指定的对象保留和释放该定时器。
第五个参数,repeats:(BOOL)yesOrNo当YES时,定时器会不断循环直至失效或被释放,当NO时,定时器会循环发送一次就失效。
例如:
检查状态,如果是开始状态,那么制空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。
– 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。
发表评论
-
ios序列化对象存储本地
2013-09-10 14:14 1678#import <Foundation/Founda ... -
Tableview详解
2013-08-22 15:47 1255一,为tableview中cell,修改其样式 [tabl ... -
使用MKNetworkKit函数Demo
2013-08-16 13:41 4176一、引入MKNetworkKit 1,添加MKNetwork ... -
ios国际化
2013-08-15 15:22 809前些天升级到Xcode4.5,现在正在用Xcode4.5+IO ... -
SDWebImage Demo手册
2013-08-13 12:58 1086分享源码,有问题回复 SDWebImage 异步加载 缓存图 ... -
ios文件读写
2013-08-12 15:44 953//写入缓存文件,缓存目录下 NSArray * ... -
ios使用预编译命令解决问题
2013-08-12 13:44 1907对于MacOS设备不同,做出相应响应 #if TARGET ... -
tableview设置上下滚动高度,启用删除
2013-08-06 17:14 1684可在viewDidAppear中实现加入 [tablvew s ... -
UILable手册
2013-08-02 13:25 8211,自动算出长度,宽度 CGSize notRecomment ... -
NSMutableArray排序
2013-07-26 15:44 1192NSMutableArray *array = [NS ... -
NSDate和NSString的转换
2013-07-15 14:43 772用于uidate,picker。。 +(NSDate ... -
c++结构体在ios端解析
2013-07-11 09:20 1081定义宏和结构体 #define ENTRYCOUNT 10 ... -
NSDate-常用操作及控制
2013-07-05 10:42 6992对于NSDate常用操作整理,如有不足请补充 1,获取当前时 ... -
NotifiCationCenter控制使用
2013-07-02 11:31 1069NSNotificationCenter 第一种,这个只是传 ... -
NSURL转NSData转UIImage
2013-07-01 15:37 17376NSAutoreleasePool *pool = [[N ... -
UIImage压缩和缩放
2013-07-01 14:31 2915节省大量内存,重绘缩略图; #define K_conten ... -
转载ios开发资源汇总
2013-06-28 15:02 1790如何用Facebook graphic api上传视频: h ... -
ios将模拟器与真机.a文件合并
2013-06-24 16:54 47981,command+b build一下工程 2,Debug- ... -
UITableViewCell自定义
2013-06-18 16:22 2210添加到选中cell中,每一个cell闪烁1秒 [tableVi ... -
PickerView准备捕获时间,循环滚动demo
2013-06-18 15:09 4373最重要的下面几行代码 - (void) clickRigh ...
相关推荐
`NSTimer`是苹果iOS和macOS开发中的一个核心组件,用于执行周期性的任务或者在特定时间点触发某个动作。这个“简单的时间选择器Nstimer”是一个实用工具,它提供了一个用户界面来控制`NSTimer`,允许用户进行暂停、...
在iOS开发中,`NSTimer`是一个非常重要的类,它允许开发者在指定的时间间隔后执行某段代码,或者定期重复执行某任务。本教程将基于"ios 时间定时器 NSTimer应用demo",深入探讨`NSTimer`的使用方法、工作原理以及...
在iOS开发中,`NSTimer` 是一个常用的类,用于执行周期性的任务。然而,在复杂的视图控制器,如 `UITableView` 中使用 `NSTimer`,可能会遇到一些挑战,特别是涉及到对象复用的情况。本篇文章将深入探讨 `NSTimer` ...
在iOS开发中,`NSTimer`是一个常用的工具,用于在特定的时间间隔执行某项操作。本文将深入探讨`NSTimer`的使用,特别是在创建小计时器时的两种类方法,以及它们如何受到屏幕滚动事件的影响及解决方案。 一、NSTimer...
在iOS开发中,`NSTimer` 是一个非常重要的类,用于在特定的时间间隔后执行某个操作,例如倒计时或定期更新UI。本教程将深入探讨`NSTimer`的使用,包括如何创建、启动、暂停以及取消定时器,并通过一个倒计时10秒的...
CADisplayLink与NSTimer都是用于在iOS开发中设置定时任务的重要工具,但它们各自的使用场景、工作原理以及优缺点都有所不同。 CADisplayLink是一个定时器对象,它将操作与显示器的刷新周期同步。这意味着,每当...
详细讲解CADisplayLink和NSTimer的区别。
在iOS和macOS开发中,`NSTimer`是苹果提供的一种强大的工具,用于在特定时间间隔后执行某个操作。它是Foundation框架的一部分,适用于Objective-C和Swift开发者。`NSTimer`可以让你的应用程序按照预设的时间间隔执行...
MKImpulse是一个用来代替系统NSTimer的高精度脉冲器 系统的NSTimer是添加到Runloop中的, 在系统繁忙时会造成偏差, 时间越长, 偏差越大 而MKImpulse是基于GCD编写的脉冲器, 精度由CPU时钟进行计算, 误差基本可以...
NSTimer-Blocks, 在NSTimer上提供块功能,简单分类 自述文件NSTimer上非常简单的类别,它可以使用块。工作原理我认为如果你使用的是一个块,你可以能不需要将任何用户指定的对象传递到计时器。 你只要从街区里得到你...
iOS NSTimer循环引用的解决方案 iOS 开发中,NSTimer 循环引用的问题是一个常见的问题。NSTimer 在创建时,会对 target 进行强引用,直到定时器作废。这样就会导致 NSTimer 和 target 之间形成循环引用,无法释放...
### NSTimer 使用 文档说明详解 #### 一、前言 在iOS开发中,`NSTimer`是一个非常实用且常见的类,它可以帮助开发者实现定时任务的功能。本文将深入解析`NSTimer`的使用方法,包括如何创建定时器、设置定时器的...
在这个项目中,我们关注的是如何利用`UIScrollView`与`UIPageControl`以及`NSTimer`来实现一个自动循环滑动的效果。下面我们将详细探讨这些知识点。 1. **UIScrollView 循环滑动** 在`UIScrollView`中实现循环滑动...
在iOS应用开发中,NSTimer是一个非常重要的组件,它允许开发者在特定的时间间隔执行特定的任务。这个"IOS应用源码——nstimer.zip"文件显然包含了关于如何在iOS应用中使用NSTimer的源代码示例。NSTimer是Foundation...
在iOS开发中,`NSTimer`是一个常用组件,用于实现定时任务。`NSTimer`的工作原理是将其添加到RunLoop中,由RunLoop来管理和触发。在本文中,我们将深入探讨`NSTimer`的使用、生命周期以及避免内存泄漏的方法。 首先...
在Swift编程中,`NSTimer`是一个非常常用的定时器类,用于执行周期性的任务。然而,如果不正确地管理,`NSTimer`可能会导致内存泄漏,因为它会在后台保持对目标对象的强引用,即使该对象已经不再需要。因此,正确地...
在iOS开发中,`NSTimer` 是一个非常重要的类,用于在特定的时间间隔执行重复或单次的任务。在这个场景中,我们看到标题提及了“ios-NStimer.zip”,这很可能是一个示例项目或者代码片段,它展示了如何使用`NSTimer`...
配合 `UIPageControl` 和 `NSTimer`,我们可以实现类似轮播图的效果,即循环播放多个视图。这个项目可能是一个简单的教程,通过 `UIScrollView` 实现图片或内容的自动切换,并通过 `UIPageControl` 显示当前所在的...
在Swift编程中,UIProgressView、NSTimer和UIStepper是三个重要的UI组件,它们各自在用户界面交互中扮演着不同的角色。这篇文章将深入探讨如何将这三个组件结合使用,为iOS应用创建动态的进度条更新功能。 首先,...