iOS5 ARC 从后台选择器调度 NSTimers 安全吗?

2024-01-26

我正在尝试调试我的应用程序。

我一直在我的非弧代码中使用一些 NSTimer 实例,如下所示(来自主线程):

[NSTimer scheduledTimerWithTimeInterval:5 target:musicPlayer selector:@selector(playPause:) userInfo:nil repeats:NO];

如果我将此代码分配给一个按钮并单击一个按钮,则效果很好。计时器启动。

我也尝试过:

 if( self.deliveryTimer == nil)
  {                 
self.deliveryTimer = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(playPause:) userInfo:nil repeats:NO];
    }

    -(void)playPause:(NSTimer*)timer
    {
           [deliveryTimer invalidate];
            deliveryTimer = nil;
//more code here

    }

我希望计时器能够执行,点击下面的播放/暂停方法,然后转到 nil,这样我就可以稍后重置计时器。我检查 nil 的原因是因为我有 3 个不同的代码路径可以设置计时器。每一个都有一个 NSLog 语句,表明计时器已被调度。

我的代码运行,并且我看到计时器正在计划中,但它们似乎不会在正常应用程序执行过程中触发。我正在调查原因。短期定时器,使用相同的逻辑触发罚款。当我让应用程序运行一段时间时,我遇到了问题。

NSTimers 可以被 ARC 回收吗?

如果我从 PerformSelectorInBackground 设置计时器有什么关系吗?当我写这个问题时,我注意到我的一些计时器是从通过以下方式调用的代码路径创建的:

[self performSelectorInBackground:@selector(notifyDelegateOfDataPoint:) withObject:data];

后台选择器可能是我的计时器不触发/提前回收的原因吗?

感谢任何帮助,这个错误已经困扰我两个多星期了!

Update: 更改代码以使用主线程后对于 NSTimers 来说,计时器正确触发,使音乐播放:

   [self performSelectorOnMainThread:@selector(deliverReminder:) withObject:nil waitUntilDone:NO];


-(void)deliverReminder:(id)sender{
     [ NSTimer scheduledTimerWithTimeInterval:10 target:reminderDeliverySystem selector:@selector(playAfterDelay:) userInfo:nil repeats:NO];
    [self postMessageWithTitle:nil message:@"Deliver Reminder Called" action:kNoContextAction];
}

-(void)playAfterDelay:(id)sender
{
    int reminderDelay = reminder.delayValue.intValue;

    [playTimers addObject:[NSTimer scheduledTimerWithTimeInterval:reminderDelay target:self selector:@selector(appMusicPlayerPlay:) userInfo:nil repeats:NO]];


}

这里我有一大堆计时器,这是因为我不知道如何使用选择器将原语传递给目标。


NSTimer 需要在后台线程中运行一个运行循环才能继续触发。主线程已经有一个活动的运行循环,这就是为什么你的计时器在其上执行时工作正常的原因。

如果您想在后台线程中使用计时器,您可以执行以下操作:

NSRunLoop* runLoop = [NSRunLoop currentRunLoop];
self.deliveryTimer = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(playPause:) userInfo:nil repeats:NO];
[runLoop run];

短持续时间计时器触发时可能发生的情况,但较长时间计时器则不然,它们是在线程仍处于活动状态时触发的,但没有运行循环来保持其运行,在线程到达执行结束后会失败。

我不认为这与 ARC 相关,尽管您可能需要注意一些事情,因为 NSRunLoop 保留了一个附加到它的计时器。遵循 NSTimers 的标准程序应该可以避免 ARC 问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS5 ARC 从后台选择器调度 NSTimers 安全吗? 的相关文章

  • if let 不解开 MKAnnotation 的 title 属性的可选值

    我想用 if let 语句解开可选值 我需要获得 MKAnnotation 的标题 func mapView mapView MKMapView didSelect view MKAnnotationView if let title vi
  • 在 UITableViewCell 中动态显示秒表计时器

    我想保存计时器值并从新的开始显示它UITableViewCell但我的问题是 我成功地能够在第一个单元格上显示秒表计时器 但是当我尝试在其中添加新单元格时UITableView所以我的计时器设置为第二个单元格 我无法定义如何让我的第一个计时
  • 将第二个 UIWindow 与 rootViewController 一起使用时,界面旋转变黑

    iOS 7 0 3 Xcode 5 0 1 我的应用程序中有第二个 UIWindow 用于在状态栏上方显示自定义放大镜 但是 一旦我设置了该窗口的 rootViewController 用于界面旋转和其他一些东西 主窗口在界面旋转动画期间就
  • Xcode 代码覆盖率和 fopen$UNIX2003

    我面临着一个似乎相当广泛的问题 当我使用 Lion 激活 Xcode 4 2 1 中的代码覆盖率时 它显示以下错误 Detected an attempt to call a symbol in system libraries that
  • RestKit:BOOL 值

    我有一个NS ENUM保存清单的状态 这两个属性是Pending and Completed typedef NS ENUM NSUInteger ChecklistStatus Pending Completed 我正在尝试获取状态并将其
  • iOS 联系人 如何通过电话号码获取联系人

    我只想通过电话号码获取联系人姓名 我尝试过这个 但速度太慢 CPU 速度超过 120 let contactStore CNContactStore let keys CNContactGivenNameKey CNContactFamil
  • ios 无法将图片上传到服务器

    您好 我正在尝试将图像从我的 IOS 设备上传到服务器 这是我上传图像的代码 IBAction btnUpload id sender if self imageViewGallery image nil UIAlertView Error
  • Core Audio 渲染线程和线程信号

    iOS 是否有任何类型的非常低级别的条件锁 不包括锁定 我正在寻找一种方法来从核心音频渲染线程内向等待线程发出信号 而不使用锁 我想知道是否可能存在像 Mach 系统调用这样的低级内容 现在我有一个核心音频线程 它使用非阻塞线程安全消息队列
  • 如何以编程方式从 iPhone 地址簿获取地址占位符文本?

    我试图为用户提供一种在基于位置的应用程序中输入地址的方法 并且我希望它看起来与 iPhone 联系人 地址簿中的地址完全相同 这意味着我需要根据所选国家 地区更新每个字段的占位符文本 例如 美国占位符是 街道 城市 State ZIP 英国
  • iOS7:我们可以在 Dynamic Type 中使用 Helvetica Neue 以外的字体吗?

    我们正在为 iOS7 设计一个应用程序 我们的设计师想要使用非默认字体 Avenir 但我不想失去动态类型功能 据我了解 动态类型只能与默认系统字体 Helvetica Neue 一起使用 是否可以使用其他字体 或者目前无法选择 据我了解
  • 在 UIPickerView 中选择某些内容时发生某些事情

    我正在致力于创建一个使用 UIPickerView 的应用程序 我制作了视图 但我试图让某个按钮改变它的功能 请帮忙 UIPickerView 和许多其他控件使用委托模式来通知您发生的事件 要使用它添加
  • 文件是为存档而构建的,这不是正在链接的体系结构(i386)

    我必须构建静态库 我想在我的 iPhone 和 iPad 应用程序中使用 当我尝试运行模拟器时 出现链接错误 我是 iOS 开发新手 请帮忙 ld 警告 忽略文件 Users valuelabs Desktop DruvaProject l
  • Xcode 11 向后兼容性:“UIWindowScene 仅在 iOS 13 或更高版本中可用”

    在 Xcode 11 中 我从 Single View App 模板创建了一个新的应用程序项目 我希望这个应用程序能够在 iOS 12 和 iOS 13 中运行 但是当我将部署目标切换到 iOS 12 时 我收到了很多类似这样的错误消息 U
  • 检查url图片是否存在

    我正在尝试使用 if 语句检查 url 图像是否存在 然而 当尝试通过错误的图像网址测试它时 它会不断返回 致命错误 在解包可选值时意外发现 nil code var httpUrl subJson image url stringValu
  • 高度在 IOS (iphone) 上无法正常工作

    我已经创建了this https codepen io salman15 project live DWbWpo Codepen 上的网站 在尝试使其响应所有平台时 我遇到了问题 看起来单个 div 覆盖了整个页面 仅在 IOS 上 并且并
  • 优化 - 步进可能表现奇怪:iOS/Unity

    我正在尝试将 Unity 集成到 iOS 应用程序中 我已经遵循了这个教程http www agnosticdev com blog entry swift integrating unity and vuforia ios swift p
  • AVAudioSessionPortBluetoothHFP、A2DP 和 LE 有什么区别?

    Apple 中记录了三种不同的蓝牙相关音频端口类型AVAudioSessionPort 描述 https developer apple com library ios documentation AVFoundation Referenc
  • 无法识别的选择器发送到类

    我已经看到 这是一个常见问题 但我自己找不到任何解决方案 这是代码 class ButtonViewController UIViewController override func viewDidLoad super viewDidLoa
  • 在 iOS 上使用 OpenGL ES 2.0 进行实例化绘制

    简而言之 谁能确认是否可以使用内置变量gl InstanceID or gl InstanceIDEXT 在 iOS 上使用 OpenGL ES 2 0 的顶点着色器中GL EXT draw instanced启用 Longer 我想使用绘
  • UICollectionview 单元格选择

    我制作了一个图像网格 为了显示其选择 我在选择时为图像绘制了边框 但问题是 当我选择顶部的一些图像并向下滚动图像网格时 底部的其他一些图像似乎也被选择了 下面是我的代码片段 UINib cellNib UINib nibWithNibNam

随机推荐