1. 引子

在面试过程中曾见过这样一道笔试题,选择你认为对的答案

A.所有对象的dealloc方法会在主线程调用

B.一个对象的dealloc方法会在分配该对象的线程被调用

C.一个对象的dealloc方法会在该对象的引用计数变为0的线程被调用

D.手动调用的当前线程中

当时对此题没有明确的答案,回去便开始查阅资料寻找答案。

2.dealloc

对象在经历其生命周期后,最终会为系统所回收,这时就会调用dealloc方法了。在每个对象的生命周期内,此方法仅执行一次,也就是当保留计数降为0的时候。然而具体何时执行,则无法保证。可以简单的理解为:“你绝不应该自己调用dealloc方法,runtime机制会在适当的时候调用他。”这样D答案可以排除。

在看A答案和B答案,我们可以假设如果对象实在主线程中创建在其他线程中被移除,该对象的dealloc应该在主线程中被调用吗?有了这样的假设就应该去小心的验证了,下面给出一段简单的代码。

#import "ViewController.h"

@interface ClassA : NSObject
@end @implementation ClassA - (void)dealloc
{
NSLog(@"dealloc is excuted in thread : %@, object : %@", [NSThread currentThread], self);
} @end
@interface ViewController ()
@property (nonatomic, strong) NSMutableArray *array;
@end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib. _array = [NSMutableArray array];
ClassA *objectA = [[ClassA alloc] init];
NSLog(@"Thread: %@, object : %@", [NSThread currentThread],objectA);
[_array addObject:objectA]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[[NSThread currentThread] setName:@"DISPATCH_QUEUE_Thread_Custom"];
[_array removeAllObjects];
});
}
@end

运行得到的输出为

2015-10-07 12:17:46.753 测试[1741:53054] Thread: <NSThread: 0x7ff223411940>{number = 1, name = main}, object : <ClassA:        0x7ff223546510>

2015-10-07 12:17:46.754 测试[1741:53110] dealloc is excuted in thread : <NSThread: 0x7ff223708ec0>{number = 2, name = DISPATCH_QUEUE_Thread_Custom}, object : <ClassA: 0x7ff223546510>

3.结论

可见, objectA 的分配是在主线程, 然后用一个数组来强引用到该对象, 并在一个dispatch_queue里清空数组,以达到释放 objectA的目的,输出的结果表明答案应该选

  C: 一个对象的dealloc方法会在该对象的引用计数变为0的线程被调用.

 

Dealloc 在哪个线程执行的更多相关文章

  1. Java多线程--让主线程等待子线程执行完毕

    使用Java多线程编程时经常遇到主线程需要等待子线程执行完成以后才能继续执行,那么接下来介绍一种简单的方式使主线程等待. java.util.concurrent.CountDownLatch 使用c ...

  2. java并发编程学习:如何等待多个线程执行完成后再继续后续处理(synchronized、join、FutureTask、CyclicBarrier)

    多线程应用中,经常会遇到这种场景:后面的处理,依赖前面的N个线程的处理结果,必须等前面的线程执行完毕后,后面的代码才允许执行. 在我不知道CyclicBarrier之前,最容易想到的就是放置一个公用的 ...

  3. 驱动插ring3线程执行代码

    近日有在写一个小东西 需要在内核态中运行一个WIN32程序 之前提到的插入APC可以满足部分要求 但是一到WIN7 x86平台下就崩溃了WIN7下只能插入第三方的进程 一插入系统进程就崩溃,但是这样满 ...

  4. 卸载AppDomain动态调用DLL异步线程执行失败

    应用场景 动态调用DLL中的类,执行类的方法实现业务插件功能 使用Assembly 来实现 但是会出现逻辑线程数异常的问题 使用AppDomain 实现动态调用,并卸载. 发现问题某个插件中开启异步线 ...

  5. 指定线程执行的顺序---join()

    线程T1,T2,T3分别启动,如何让其执行顺序变为T3>T2>T1: 线程1: package test6; public class Thread1 extends Thread{ pr ...

  6. java并发:获取线程执行结果(Callable、Future、FutureTask)

    初识Callable and Future 在编码时,我们可以通过继承Thread或是实现Runnable接口来创建线程,但是这两种方式都存在一个缺陷:在执行完任务之后无法获取执行结果.如果需要获取执 ...

  7. Java多线程——<三>简单的线程执行:Executor

    一.概述 按照<Java多线程——<一><二>>中所讲,我们要使用线程,目前都是显示的声明Thread,并调用其start()方法.多线程并行,明显我们需要声明多个 ...

  8. c#等待所有子线程执行完毕方法

    当我们在使用线程中,你会发现主线结束后子线程的结果才显示出来.现在我要等待所以子线程结束,然后在显示结果,怎么做呢? 方法如下: 1.使用 ManualResetEvent,代码如下:  using  ...

  9. Java如何等待子线程执行结束

    工作中往往会遇到异步去执行某段逻辑, 然后先处理其他事情, 处理完后再把那段逻辑的处理结果进行汇总的产景, 这时候就需要使用线程了. 一个线程启动之后, 是异步的去执行需要执行的内容的, 不会影响主线 ...

随机推荐

  1. SaltStack管理从这里开始

    Modules 1:查看所有module列表: salt 'jcfx-4' sys.list_modules jcfx-4: - acl - aliases - alternatives - apac ...

  2. Altium Designer快捷键 【worldsing笔记】

    Shift + R 切换三种布线模式 (忽略, 避开或推挤) Shift + E 触发电气格点开/关 Shift + B 建立查询 Shift + PgUp 放大到最小的递增 Shift + PgDn ...

  3. Sublime Text2 中Emmet(之前叫Zencoding)插件安装以及使用

    一.添加插件之前先 下载Package Control 按 Ctrl+`(就是~这个键) 复制下面的代码 确认 重新启动sublime text2 import urllib2,os;pf='Pack ...

  4. home_work--用户登陆

    前提: 根据文本中的已有用户和密码,实现登陆的交互:在用户输入用户名后,会有一个检测用户是否被锁定的环节:如果用户三次密码输入错误,则该用户则会被添加到锁定文件中,无法登陆. 涉及到的知识点: 1.p ...

  5. 使用 StoryBoard 的时候加入用户引导页面

    如果想让一个APP加上引导页面是一个非常完美的举动 但是,总会遇到一些问题 (不要忘记在APDelegate里面加上用户引导页面的头文件和程序启动时的第一个页面哦) 情况一:纯代码 判断是否是第一次启 ...

  6. Fox-H 函数

    1.定义 2.特例 3.在分数阶微分方程中的应用 4.如何画图

  7. readonly disabled 区别

    readonly 提交表单时包含该属性的内容 控件 disabled 不包含该属性

  8. spring aop 的一个demo(未完,待完善)

    假设我们有这样的一个场景 : 对于一个类的众多方法,有些方法需要从缓存读取数据,有些则需要直接从数据库读取数据.怎样实现呢? 实现方案有多种.下面我说下常见的几种实现方案 : 1.直接采用spring ...

  9. hdu 5465 Clarke and puzzle 二维线段树

    Clarke and puzzle Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php? ...

  10. 【Android开发经验】使用Ant批量打包Android应用全然指南

    本文章由Socks完毕.博客地址:http://blog.csdn.net/zhaokaiqiang1992 转载请说明. 折腾了一下午.百度了一下午,最终实现了使用Ant对Android应用的批量打 ...