释放NSTimer的正确方法?

2023-12-03

在我的 dealloc 方法中释放 NSTimer 的正确方法是什么?它是用以下代码创建的?

-(void)mainTimerLoop {

     mainTimer = [NSTimer scheduledTimerWithTimeInterval:1/10
                                                  target:self 
                                                selector:@selector(gameLoop) 
                                                userInfo:nil
                                                 repeats:YES];
}

Thanks


按照你这样做的方式,你永远不会击中dealloc。计时器保留其目标。在这种情况下,这意味着计时器已保留您。在其失效之前,它不会释放您。由于您创建了计时器,因此您还必须在之前的某个时刻使其无效dealloc,因为计时器的保留会阻止你的对象被dealloced.

您有两个选择:

  • 找到另一个地方使计时器无效(视图离开屏幕,应用程序正在终止,你有什么)
  • 将其他内容设置为计时器的目标。

以后者为例:

@interface GameLoopTimerTarget : NSObject {
    id owner;  /* not retained! */
}
- (id)initWithOwner:(id)owner;
- (void)timerDidFire:(NSTimer *)t;
@end

@implementation GameLoopTimerTarget
- (id)initWithOwner:(id)owner_ {
    self = [super init];
    if (!self) return nil;

    owner = owner_;
    return self;
}

- (void)timerDidFire:(NSTimer *)t {
#pragma unused (t)
    [owner performSelector:@selector(gameLoop)];
}
@end

/* In your main object… */
/* assume synthesized:
@property (retain, NS_NONATOMIC_IPHONE_ONLY) GameLoopTimer *mainTimerTarget; */
- (void)mainTimerLoop {
    self.mainTimerTarget = [[[GameLoopTimerTarget alloc] initWithOwner:self] autorelease];
    mainTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/10.0 target:self.mainTimerTarget selector:@selector(timerDidFire:) userInfo:nil repeats:YES];
}

- (void)dealloc {
    /* other stuff */
    [timer invalidate], timer = nil;
    [mainTimerTarget release], mainTimerTarget = nil;
    /* more stuff */
    [super dealloc];
}

注意时间间隔是怎样的1.0/10.0- 这也可以写成0.1, 但它cannot被写1/10,因为该除法将截断为0.0.

另请注意这如何破坏保留周期:

  • 您和您的计时器都保留计时器目标。
  • 您在正常时间点击了dealloc。
  • 然后,您使计时器无效并释放计时器目标。
  • 然后计时器目标被释放。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

释放NSTimer的正确方法? 的相关文章

  • 将 UIPanGestureRecognizer 添加到 UIScrollView 时禁用滚动

    我有一个滚动视图 我想让它在平移完成时消失 它工作正常 平移时滚动视图消失 但问题是现在我无法滚动内容 UIView animateWithDuration 0 2 delay 0 2 options UIViewAnimationCurv
  • 使用自动布局时 UIScrollview 的中心内容

    我在项目中使用自动布局 并且有一个滚动视图 其中有一个居中的按钮 我已经让滚动视图滚动 但不占据整个屏幕 我尝试按照此处的教程进行操作 https developer apple com library ios technotes tn21
  • xcode 6 资产目录 iPhone 6

    这个问题还没有得到解答 使用资产目录时 特定于设备 非通用 选项为 1x 2x r 2x 3x 1x 是不必要的 因为它不是视网膜 2x 是 ip4 的最佳选择 分辨率为 640x960 r 2x 适合 ip5 分辨率为 640x1136
  • 以编程方式停止 iphone 上的 uipickerview 动画

    我有一个包含选择器和 UIToolbar 的 UIActionSheet UIToolBar 上有一个保存按钮 然而 我的一些用户报告说在 UIPickerView 停止旋转之前按下了保存按钮 因此仅检索初始值 旋转之前 有没有办法在用户点
  • sizeToFit 运行异常

    我有一段代码 每次发生后端数据库更改时都会执行 本质上我在父视图中有一个标签 标签由许多状态消息之一更新 每个状态消息位于不同的行上 并以换行符 n 结尾 每条状态消息只能在一行上 并且不能过多 我遇到的问题是 当视图首次重新加载时 一切正
  • Visual Studio 2010 支持 iPhone 开发吗? [复制]

    这个问题在这里已经有答案了 可能的重复 如何使用 Windows 开发机为 iPhone 进行开发 https stackoverflow com questions 22358 how can i develop for iphone u
  • 如何知道两个 NSDate 是否在同一天

    你知道如何知道两个NSDate是同一天 我想考虑到区域设置 使用a可能很容易timeIntervalSinceDate 但星期一 23H58 和星期二 00H01 不在同一天 处理NSDate和计算区域设置不是很容易 NSCalendar
  • “EXC_BAD_ACCESS”与“分段错误”。两者实际上相同吗?

    在我的前几个虚拟应用程序 用于学习时练习 中 我遇到了很多EXC BAD ACCESS 这以某种方式告诉我错误访问是 您正在触摸 访问一个不应该的对象 因为它尚未分配或释放 或者只是您无权访问它 查看此示例代码 该代码存在访问错误问题 因为
  • iOS - 在 UITabBar 上方获取所需的阴影

    我试图让我的标签栏阴影看起来像这张图片中看到的那样 这样做的最佳方法是什么 我正在使用 Objective C Thanks 您可以使用以下代码为任何 UI 对象提供阴影 tabBar layer shadowOffset CGSize w
  • iPhone 和 iPad 滚动结束

    我正在制作一些无限滚动的 jQuery 跨浏览器画廊 我工作得很好 但在 iPhone 上 我想也在 iPad 上 而不是相等的值 我有一些不成比例的值不匹配 window scrollTop document height window
  • 增量后清除推送通知徽章

    我正在研究 iPhone 中的推送通知 当我收到推送通知时 它在我的应用程序图标上显示 1 下次显示 2 3 4 如果我打开应用程序 它是 0 下次它应该是 1 2 3 4 但它显示最后一个数字和 1 我想在打开应用程序后重置推送通知徽章
  • 双击并滑动/拖动手指以放大/缩小

    如果有人使用过 iOS 版谷歌地图应用程序 那么它有一个很棒的功能 可以用一根手指放大 缩小 双击 uiscrollview 然后立即向上或向下滑动手指以放大 缩小 有谁知道这是如何实现的 谷歌发布了任何片段吗 我将此功能添加到我的 UIS
  • Xcode 中的 NSObject 描述和自定义摘要

    我覆盖对象的 NSString description但是 Xcode 总是显示error summary string parsing error在变量视图的摘要字段中 我当前的实现如下 NSString description retu
  • 如何在 iOS 应用程序中检测所有可用的 Wifi 网络并连接到其中之一

    在我的 iOS 应用程序中 我想检测所有可用的 wifi 网络 然后从列表中选择一个网络并连接到它 目标是不打开应用程序内置的设置来连接 Wi Fi 而是在我的应用程序中完成这一切 首先 这可能吗 如果可能的话 请指出要使用哪些框架和方法
  • 播放循环声音的最简单方法是什么?

    在 iPhone 应用程序中播放循环声音的最简单方法是什么 可能最简单的解决方案是使用AVA音频播放器 http developer apple com library ios DOCUMENTATION AVFoundation Refe
  • 使用 MPMoviePlayerViewController 时的 iPad 旋转错误

    问题摘要 使用 MPMoviePlayerViewController 播放视频时更改 iPad 设备或模拟器的方向会导致视频播放器关闭时旋转状态不一致 这是 iPad SDK 3 2 中的一个已知错误 记录于http www openra
  • 共享扩展程序未出现在能够在 iPhone 上共享照片的应用程序列表中

    我正在尝试创建一个共享应用程序扩展 并按照以下来源的教程进行操作 http www technetexperts com mobile share extension in ios application overview with exa
  • iOS 开发:如何强制 UIWebView 加载 Facebook 的非移动版本?

    我正在深入研究 iOS 开发 当我尝试在 UIWebView 中加载特定的 Facebook 粉丝页面时 它会加载该网站的移动版本 该版本仅加载粉丝页面的墙 而不是我需要加载的特定选项卡 在我的应用程序的 iPad 版本中 UIWebVie
  • 是否所有新应用程序都必须在 iPad 上运行才能通过应用程序商店审批流程? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我的一个朋友告诉我 有一个新的规则可以通过应用商店的审批流程 该应用程序还必须在 iPad 上运行 否则会被拒绝 我没有找到任何支持他说法的东西
  • 构建 iOS 应用程序后退出代码 1 错误

    我正在尝试使用 RestKit 构建我的项目 当我构建它时 我收到以下错误 我尝试使用 Apple LLVM 3 0 和 LLVM GCC 4 2 进行编译 两者都产生相同的结果 任何人有任何想法是什么导致了这个问题 Ld Users Ji

随机推荐

  • 使用 .addOnSuccessListener 返回私有方法的值

    再会 有什么方法可以实现这个吗 val db Firebase firestore val userID Firebase auth currentUser uid val infoRef db collection user docume
  • 如何在 Mongo 中查询“is not null”?

    我想执行以下查询 db mycollection find HAS IMAGE URL 正确的语法应该是什么 这将返回带有名为 IMAGE URL 键的所有文档 但它们可能仍然具有空值 db mycollection find IMAGE
  • BlueZ 兼容内核版本

    我在 Linux 中使用内核版本 3 0 35 和 bluez 4 98 这样我就可以按照 SO 问题之一中给出的 hcitool 命令来宣传 ibeacon 我还能够连接到其他 ble 设备 但无法使用 gatttool 中的 主要 列出
  • 在javascript中将数字转换为日期格式yyyymmdd到mm/dd/yyyy

    我正在获取 XML 提要并使用 JavaScript 将其写入 HTML 日期字段有 20120319 我想做的是将其转换为更易读的格式 例如 03 19 2012 在 JavaScript 中是否有一种简单的方法可以做到这一点 一种方法是
  • Spark:将 2 元组键 RDD 与单键 RDD 连接的最佳策略是什么?

    我有两个想要加入的 RDD 它们看起来像这样 val rdd1 RDD T U val rdd2 RDD T W V 碰巧的是 关键值rdd1是唯一的 并且元组键值rdd2是独一无二的 我想加入这两个数据集 以便得到以下 rdd val r
  • adb 无法将 .apk 文件复制到 Android 模拟器:没有这样的文件或目录

    我在让 MyFirstApp Hello World Android 应用程序在模拟器中运行时遇到了障碍 我正在按照以下网址的说明进行操作 http developer android com training basics firstap
  • 从 XSL 调用 Java (SAXON)

    我正在尝试使用 java 中的 Saxon 处理器 我正在使用saxon9ee jar里面 saxonee9 3 0 11j zip 刚刚下载 没有许可证 是否需要它才能工作 Their 可以在这里找到资源 http www saxonic
  • Swift - 圆角半径和投影问题

    我正在尝试创建一个按钮圆角 and a 阴影 无论我如何切换 该按钮都无法正确显示 我试过了masksToBounds false and masksToBounds true 但是要么圆角半径起作用而阴影不起作用 要么阴影起作用而圆角半径
  • @ManagedBean @Component 类中的 @Autowired 服务在 JSF 请求期间为 null [重复]

    这个问题在这里已经有答案了 我尝试过将 Spring 3 MVC 与 JSF 2 结合起来 我在 Spring 和 JSF 方面有一些经验 但之前从未尝试过加入它们 最后我有2个文件 ManagedBean name userBean Sc
  • CUDA C++11,lambda 数组,按索引的函数,不起作用

    我在尝试让 CUDA 程序按索引管理 lambda 数组时遇到问题 重现问题的示例代码 include
  • responseText 有效,但 responseXML 始终为 null

    我已经浏览了这里可以找到的所有答案 但无法解决这个问题 我很确定我没有错过任何明显的事情 我正在尝试加载基于经纬度的地图标记 问题是 当我尝试返回 AJAX 响应时 responseXML 始终为 null 如果我使用responseTex
  • 如何使用 Facebook GRAPH API 删除 Facebook 评论帖子?

    我开始研究这个是因为我希望能够删除 Facebook 活动墙上的评论 因为 删除帖子 似乎不适用于活动墙上的评论 然而 由于我不知道是否有可能 我决定看看是否可以手动删除我在自己的墙上发布的帖子 因为这是可能的 注意我是NOT使用任何 SD
  • Intent.getExtras() 总是返回 null

    我正在尝试通过通知和事件运行活动onCreate我想 重定向 为此添加对信息的思考Intent班级 一个重要的特性是生成通知的类是通过服务执行的 我从中检索上下文getApplicationContext类提供的方法android app
  • 在文件名前批量添加字符串

    我正在处理 Windows 批处理文件 需要更改当前目录中的文件名 我有这些文件 file1 txt file2 txt file3 txt 我需要在每个文件名之前添加字符串 REG 如下所示 REG file1 txt REG file2
  • VBA控制功能区?

    我正在为 Excel 2010 创建 VBA 加载项 我使用了 Microsoft Office 的自定义 UI 编辑器 创建我自己的功能区的工具 但是 我想为用户提供加载我的加载项的选项 而不显示功能区 或者显示功能区的不同部分 通过菜单
  • tf_agents 自定义 time_step_spec

    我正在修改 tf agents 但在定制时遇到问题time step spec 我正在尝试在健身房 Breakout v0 中训练 tf agent 我已经制作了一个函数来预处理观察结果 游戏像素 现在我想修改 time step 和 ti
  • Silverlight Web 服务调用在 Studio 中可以工作,但从网站运行时失败

    我们正在构建一个 Silverlight 应用程序并调用 Silverlight WCF 服务 从 Visual Studio 运行应用程序时 一切正常 当我们部署到网站并运行应用程序时 每次调用 Web 服务时 我们都会收到以下错误 或类
  • 何时使用“sbt 程序集”和“sbt 编译 && sbt 包”?

    我想知道我什么时候应该使用sbt assembly什么时候sbt compile sbt package 我正在使用 Intellij IDEA 在本地计算机上编写一个程序 并使用以下命令进行编译sbt compile sbt packag
  • 如何使用外部自定义 CSS 覆盖 Bootstrap 3 样式?

    如何使用外部自定义 CSS 覆盖 Bootstrap 3 样式 div class navbar navbar inverse navbar fixed top div CSS navbar inverse background color
  • 释放NSTimer的正确方法?

    在我的 dealloc 方法中释放 NSTimer 的正确方法是什么 它是用以下代码创建的 void mainTimerLoop mainTimer NSTimer scheduledTimerWithTimeInterval 1 10 t