什么时候释放 NSThread 是安全的?

2023-12-06

下面是我的辅助 NSThread* processThread 的运行循环

要关闭我调用的线程

//cancel secondary thread
[processThread cancel]
//signal condition
[processCondition broadcast];

那么拨打电话是否安全:

[processCondition release];
[processThread release];

或者我需要确保线程已经完成吗?

也许像这样?

NSTimeInterval timeout = [NSDate timeIntervalSinceReferenceDate] + (1.0/15.0);

while ([processThread isExecuting] && [NSDate timeIntervalSinceReferenceDate] < timeout)
{
    [NSThread sleepForTimeInterval: 1.0/1000.0 ];
}

[processCondition release];
[processThread release];




详细代码和解释:

- (void)processLoop
{
    NSAutoreleasePool * outerPool = [[NSAutoreleasePool alloc] init];
    [processCondition lock];

    //outer loop    
    //this loop runs until my application exits
    while (![[NSThread currentThread] isCancelled])    
    {
        NSAutoreleasePool *middlePool = [[NSAutoreleasePool alloc];
        if(processGo)
        {
            //inner loop
            //this loop runs typically for a few seconds
            while (processGo && ![[NSThread currentThread] isCancelled]) 
            {
                NSAutoreleasePool *innerPool = [[NSAutoreleasePool alloc]; init];
                //within inner loop
                //this takes a fraction of a second
                [self doSomething];
                [innerPool release];
            }
            [self tidyThingsUp];

        }
        else
        {
            [processCondition wait];
        } 
        [middlePool release];
    }
    [processCondition unlock];      
    [outerPool release];
}

的组合:

  • 内部 while 循环
  • NSCondition *processCondition
  • 切换processGo之间YES and NO

允许我停止和启动内部 while 循环而不取消线程。

if (processGo == YES)


执行进入内部while循环。

当主线程设置时

processGo = NO

执行离开内部 while 循环并整理
在外循环的下一次传递中,执行命中

[processCondition wait]

并等待

如果主线程重置

processGo == YES

并打电话

[processCondition wait]

执行重新进入内循环


是的,如果您已经完成了 NSThread 的调用,那么调用 release 是安全的。在非 GC Objective C 代码中,习惯用法是,一旦访问完对象,就可以释放它。如果有其他东西需要该对象,包括对象本身,他们的工作就是对其进行保留。一般来说,如果一个对象不能在任意时间被安全处置,它将在处于不安全状态时保留自身,并在可以安全处置时释放自身。

这就是 NSThread 和 NSURLConnection 之类的工作方式(NSURLConnection 实际上保留了它的委托,并做了很多奇特的事情来应对发生的保留循环。

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

什么时候释放 NSThread 是安全的? 的相关文章

  • BufferBlock 连续

    我想使用以下方式实现消费者 生产者模式BufferBlock
  • 隐藏故事板中的导航栏

    谁能告诉我如何隐藏故事板中的导航栏 我下面的代码在模拟器中运行时工作正常 但它仍然出现在我的故事板中 这真的很烦我 因为它弄乱了我的图像的位置 有人可以帮忙吗 void viewWillAppear BOOL animated super
  • UITableView 在单元格刷新时滚动到顶部

    我有一个 UITableView 其中一个单元格的大小是动态调整的 以适应其中的 UITextView 每当键入一个键时 单元格都会检查计算出的高度是否增加 就像换行符一样 因此它可以告诉表单元格的高度需要重新计算 我用这段代码做到了这一点
  • 如何在 iPhone 中查找本周的最后一天?

    在我的应用程序中 我使用以下代码来检索当前日期和星期 NSDate today1 NSDate date NSDateFormatter dateFormat NSDateFormatter alloc init dateFormat se
  • 符号化 iPad 崩溃日志后回溯仍然不可读

    我有这些崩溃日志 在我将它们放入管理器中后 会自动进行符号化 但结果始终相同 iOS 调用得到符号化 而我的应用程序调用则没有 我尝试将 Dym 和应用程序文件复制到同一文件夹中 删除并再次复制回来 没有任何帮助 知道发生了什么事吗 所以我
  • 何时分离或加入 boost 线程?

    我有一个方法 大约每 30 秒触发一次 我需要在一个线程中包含它 我有一个可以从类外调用的方法 像 call Threaded Method 这样的东西会创建一个线程 该线程本身会调用最终的线程方法 这些是 MyClass 的方法 void
  • iOS 低内存崩溃,但内存使用率非常低

    这已经困扰我很长时间了 我的应用程序运行占用大约 2 74MB 内存 没关系 但当它创建 UIWebView 时 它会增加到大约 5 87MB 并继续崩溃 这些是在我的第一代 iPad 上运行时仪器中的实时字节下给出的值 我找不到崩溃日志
  • 自定义信息窗口上的按钮未接收 ios 中的操作

    我在 iOS 应用程序中使用 Google 地图 并实现了一个自定义信息窗口来显示标记的标题 现在 我在该自定义信息窗口上添加了一个按钮 但我的问题是按钮操作方法没有被调用 自定义信息窗口 h import
  • iOS后台获取时间限制崩溃

    我已经设置了背景获取 使用大纲NSScreencast 第 92 集 http nsscreencast com episodes 92 background fetch BOOL application UIApplication app
  • 将带有 **kwargs 错误的值线程化并传递给 TypeError

    我对 Python 还很陌生 并且正在通过这篇文章研究如何使用线程来处理某些代码 Python 使用线程或队列迭代调用函数的 for 循环 https stackoverflow com questions 12868956 python
  • Swift try inside Objective-C 块

    我需要创建一个函数foo它接受一个抛出闭包作为参数 我可以使用 Swift 或 ObjC 来实现它 但我需要能够从两者中调用它 像这样 Swift func bar throws func foo block throws gt void
  • C# 为所有对象订阅相同的事件处理程序是线程安全的吗

    我的项目中有一种情况 我连接到多个服务器并监听事件 每当从服务器接收到事件时 Handler 就应该将该事件添加到公共队列中进行处理 所有连接都应将接收到的事件添加到队列中 foreach var item in collection Co
  • NSString 对象的最大长度是多少?

    NSString 对象中可以保存的最大字符串大小是多少 这会动态变化吗 我假设 NSString 的硬限制是 NSUIntegerMax 个字符 因为 NSString 的索引和大小相关的方法返回 NSUInteger 由于当前能够运行 i
  • Xcode - 发布和分发配置中的 Malloc_Error

    仅当我在设备上选择发布或分发配置时 我才会收到此错误 在模拟器上它运行良好 请问 我错在哪里 cc1obj 4113 malloc mmap size 429379584 failed error code 12 error can t a
  • 使用 JSONKit 解析 JSON 文件

    我正在构建一个音叉应用程序 货叉应允许最多 12 个预设节距 此外 我希望允许用户选择一个主题 每个主题都会加载一组预设 不必使用所有预设 我的配置文件看起来像这样 theme A3 comment An octave below conc
  • java中的负载均衡线程池的种类

    我正在寻找一个负载平衡的线程池 到目前为止还没有成功 不确定负载平衡是否是正确的措辞 让我解释一下我试图实现的目标 第1部分 我有 Jobs 有 8 到 10 个单一任务 在 6 核 CPU 上 我让 8 个线程并行处理此任务 这似乎提供了
  • 从设备获取联系人列表时出现问题

    这段代码有什么问题 NSMutableArray contactArray NSMutableArray alloc init ABAddressBookRef addressBook ABAddressBookCreate CFArray
  • 调用当前的 Modal ViewController 两次?

    我遇到了 UIViewController presentModalViewController 被调用两次的问题 我有一个模态视图 我试图调出另一个模态视图 但第二次没有任何反应 我怀疑它被隐藏了 还有其他人这样做过吗 您不能在同一个父控
  • iOS 7 NS 单线程安全合并冲突

    重新排序两行后 在单线程应用程序上保存简单的数据时遇到问题 我已经成功地简化了编码以重现错误 并且希望其他人尝试这一点时得到第二个意见 这是一次健全性检查 因为我怀疑 iOS 7 引入的核心数据问题 而这在 iOS 6 中工作正常 首先 启
  • 带有自定义字体的 UILabel 错误呈现

    在我的 iPhone 应用程序中 我为所有 UILabel 设置了自定义字体 更准确地说 我对 UILabel 进行了子类化 重写了一个方法 在该方法中设置了自定义字体 然后将 IB 中的所有标签设置为该自定义类 现在的问题是 所有文本都渲

随机推荐