今天无意这中遇到一个奇怪的崩溃,先上引起崩溃的代码:

- (void)dealloc
{__weak __typeof(self)weak_self = self;NSLog(@"%@", weak_self);
}

当执行到dealloc的时候,程序就crash 掉了。
崩溃信息如下:

objc[4572]: Cannot form weak reference to instance (0x160f6f890) of class MFChatRoomBoardController. It is possible that this object was over-released, or is in the process of deallocation.
(lldb)
error: empty command
(lldb) bt
* thread #1: tid = 0x35914d, 0x0000000182307aac libobjc.A.dylib`_objc_trap(), queue = 'com.apple.main-thread', stop reason = EXC_BREAKPOINT (code=1, subcode=0x182307aac)* frame #0: 0x0000000182307aac libobjc.A.dylib`_objc_trap()frame #1: 0x0000000182307b24 libobjc.A.dylib`_objc_fatal(char const*, ...) + 88frame #2: 0x0000000182319890 libobjc.A.dylib`weak_register_no_lock + 316frame #3: 0x0000000182320688 libobjc.A.dylib`objc_initWeak + 224frame #4: 0x000000010022bf8c MakeFriends`-[MFChatRoomBoardController dealloc](self=0x0000000160f6f890, _cmd="dealloc") + 36 at MFChatRoomBoardController.m:31

其中,可以在控制台明确看到这样一段描述:

objc[4572]: Cannot form weak reference to instance (0x160f6f890) of class MFChatRoomBoardController. It is possible that this object was over-released, or is in the process of deallocation.

说明不允许在 dealloc 的时候取 weak self.

查看了一下 weak_register_no_lock 的函数代码,找到问题所在。

id
weak_register_no_lock(weak_table_t *weak_table, id referent_id, id *referrer_id)
{objc_object *referent = (objc_object *)referent_id;objc_object **referrer = (objc_object **)referrer_id;if (!referent  ||  referent->isTaggedPointer()) return referent_id;// ensure that the referenced object is viablebool deallocating;if (!referent->ISA()->hasCustomRR()) {deallocating = referent->rootIsDeallocating();}else {BOOL (*allowsWeakReference)(objc_object *, SEL) = (BOOL(*)(objc_object *, SEL))object_getMethodImplementation((id)referent, SEL_allowsWeakReference);if ((IMP)allowsWeakReference == _objc_msgForward) {return nil;}deallocating =! (*allowsWeakReference)(referent, SEL_allowsWeakReference);}if (deallocating) {_objc_fatal("Cannot form weak reference to instance (%p) of ""class %s. It is possible that this object was ""over-released, or is in the process of deallocation.",(void*)referent, object_getClassName((id)referent));}// now remember it and where it is being storedweak_entry_t *entry;if ((entry = weak_entry_for_referent(weak_table, referent))) {append_referrer(entry, referrer);} else {weak_entry_t new_entry;new_entry.referent = referent;new_entry.out_of_line = 0;new_entry.inline_referrers[0] = referrer;for (size_t i = 1; i < WEAK_INLINE_COUNT; i++) {new_entry.inline_referrers[i] = nil;}weak_grow_maybe(weak_table);weak_entry_insert(weak_table, &new_entry);}// Do not set *referrer. objc_storeWeak() requires that the // value not change.return referent_id;
}

可以看出,runtime 是通过检查引用计数的个数来判断对象是否在 deallocting, 然后通过

    if (deallocating) {_objc_fatal("Cannot form weak reference to instance (%p) of ""class %s. It is possible that this object was ""over-released, or is in the process of deallocation.",(void*)referent, object_getClassName((id)referent));}

这段代码让程序crash。

再看一下 _objc_fatal 这个函数

void _objc_fatal(const char *fmt, ...)
{va_list ap; char *buf1;char *buf2;va_start(ap,fmt); vasprintf(&buf1, fmt, ap);va_end (ap);asprintf(&buf2, "objc[%d]: %s\n", getpid(), buf1);_objc_syslog(buf2);_objc_crashlog(buf2);_objc_trap();
}

可以看到这个函数实际会在控制台输出一段信息,然后调用 _objc_trap() 引起 crash. 而最后一个函数调用刚好也对上我们之前的崩溃堆栈。

转自:http://www.jianshu.com/p/841f60876180

转载于:https://www.cnblogs.com/huangzs/p/7455404.html

dealloc时取weakself引起崩溃相关推荐

  1. 爬虫 网站服务器瘫痪,如何解决搜索爬虫高频次抓取导致服务器崩溃的问题

    如何解决搜索爬虫高频次抓取导致服务器崩溃的问题 首先声明一点,如果网站能够承受爬虫的高频次访问,那是一件好事,这样有利于网站页面收录,提升网站来自搜索的访问量.但一旦承受不了,我们可以进行如下的操作. ...

  2. robots.txt屏蔽海外无用蜘蛛,防止大量蜘蛛抓取导致网站崩溃(资源宝博客整理分享)

    屏蔽海外无用蜘蛛,防止大量蜘蛛抓取导致网站崩溃 robots协议 也叫robots.txt(统一小写)是一种存放于网站根目录下的ASCII编码的文本文件,它通常告诉网络搜索引擎的蜘蛛,此网站中的哪些内 ...

  3. sql:当一列为空时取另一列(case when then)

    在移动广告业务中,设备基本上分成两大阵营:安卓和ios,所以在设置设备库的时候一般都会有两个字段一个叫imei,对应ios的设备id则叫idfa. 当手机为安卓时,imei字段有值,idfa为空:当设 ...

  4. Css hover时 取子元素 切换img 实现图片移入切换

    <div class="patent-case"><div class="patent-title-imgo"><img src= ...

  5. 梦幻西游服务器维护不完了,梦幻西游:周二维护的内容太多,周一公布时所有服务器都崩溃的...

    游戏的意义就在于它能够给人带来快乐,如果过多的掺杂其他的东西就失去了其本身的意义,大家好,我是小三,每天给大家分享游戏中的八卦趣事. 梦幻西游在每周的周二都会进行例行的维护,一般都是上线上周测试的内容 ...

  6. 关于Linux系统下在使用close关闭串口设备时引起的内核崩溃问题解决方法

    有时在Linux系统下使用串口时,在操作关闭时会遇到内核崩溃或者其他的一些问题. 经过研究发现很可能是数据未发送完成引起的,即在关闭的时候,串口还在忙碌状态导致了崩溃问题. 解决方法就是,等待串口完成 ...

  7. 编程时程序无错却崩溃_人间真实:程序员的 60 个崩溃瞬间!

    源 / 程序员最幽默(ID:humor1024) @程序员,你是否曾经历过这些令你分分钟崩溃或啼笑皆非的绝望瞬间?前方高能预警,这不是演习! 1. 公司实习生找 Bug 2. 在调试时,将断点设置在错 ...

  8. 三星s7不能运行java_在调试模式下启动时Android应用程序崩溃

    当我在 debug 模式下运行时,应用程序崩溃了,但是当我正常运行它时它会起作用 . 我认为附加调试器时会出现问题 . 日志: A/art: art/runtime/jdwp/jdwp_event.c ...

  9. linux c 程序崩溃日志,C:Linux:调用write()时TCP / IP程序崩溃

    我有一个循环,它通过TCP / IP不断向客户端写入数据.连接打开如下: newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, & ...

最新文章

  1. 精通JavaScript--01面向对象JavaScript
  2. 【研发管理】中国企业 VS 世界优秀企业在产品研发上差距(下)
  3. 魔法城堡计算机谱子,TFBOYS魔法城堡歌谱及歌词
  4. Hadoop学习之路一 Single Node Setup
  5. Collection 和 Collections区别
  6. 【转】UML基础: 第 2 部分 - 对象图 (Object Diagram)
  7. SSH服务-SSH秘钥对登陆
  8. Android BLE(2)---蓝牙学习
  9. vscode在windows10系统下进行go语言编程(无法代码提示)
  10. [摘抄]隧道尽头的灯
  11. 单向链表的python实现
  12. Win7下建立Wifi热点
  13. Atitit  文件上传  架构设计 实现机制 解决方案  实践java php c#.net js javascript  c++ python
  14. 计算机科研立项应用类题目,省级课题计算机课题题目推荐
  15. en结尾的单词_en后缀形容词——动词
  16. 医学成像学习笔记(一):核磁共振成像(MRI)k空间为何是图像频谱详解
  17. 史上最强窃密软件来袭,手机或成泄密工具
  18. 时间日期插件引用使用方法
  19. Xcode9中,添加图片素材无法显示的问题
  20. Flutter之extension

热门文章

  1. jvm虚拟机_一文入门jvm虚拟机
  2. Mybatis快速入门的代码实现及报错处理解决org.apache.ibatis.exceptions.PersistenceException
  3. php mariadb 查询语法,从PHP调用的查询中的MySQL(MariaDB)执行超时
  4. python运行程序的快捷键_在Python集成开发环境中,可使用快捷键()运行程序。...
  5. 二叉树的后序遍历Python解法
  6. PyCharm的光标插入与覆盖模式
  7. 伺服电机要计算机控制,计控 - it610.com
  8. 基站定位php,SIM800C支持基站定位功能了。。。
  9. linux抓取网络信息,Linux获取所有网口及其详细信息
  10. 面向对象也可以搞单片机!