我是靠谱客的博主 含蓄花生,最近开发中收集的这篇文章主要介绍NSTimer invalidate 和 release 释放问题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

[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 invalidate 和 release 释放问题的全部内容,希望文章能够帮你解决NSTimer invalidate 和 release 释放问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部