ARC下面的对象被释放的bug
一般在ARC管理的方式之下,很难出现对象被过度释放的问题,下面是我将遇到的一个crash。
* thread #: tid = 0x31d1db, 0x0000000102e5e00b libobjc.A.dylib`objc_msgSend + , queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=, address=0x18)
frame #: 0x0000000102e5e00b libobjc.A.dylib`objc_msgSend +
frame #: 0x0000000101968212 UIKit`-[UISectionRowData refreshWithSection:tableView:tableViewRowData:] +
frame #: 0x000000010196de45 UIKit`-[UITableViewRowData rectForFooterInSection:heightCanBeGuessed:] +
frame #: 0x000000010196df3a UIKit`-[UITableViewRowData heightForTable] +
frame #: 0x00000001017c0af0 UIKit`-[UITableView _updateContentSize] +
frame #: 0x00000001017ddecd UIKit`-[UITableView didMoveToWindow] +
frame #: 0x00000001017649a0 UIKit`-[UIView(Internal) _didMoveFromWindow:toWindow:] +
frame #: 0x0000000101775333 UIKit`-[UIScrollView _didMoveFromWindow:toWindow:] +
frame #: 0x000000010176468e UIKit`-[UIView(Internal) _didMoveFromWindow:toWindow:] +
frame #: 0x000000010176468e UIKit`-[UIView(Internal) _didMoveFromWindow:toWindow:] +
frame #: 0x000000010176468e UIKit`-[UIView(Internal) _didMoveFromWindow:toWindow:] +
frame #: 0x000000010176468e UIKit`-[UIView(Internal) _didMoveFromWindow:toWindow:] +
frame #: 0x000000010175d112 UIKit`__45-[UIView(Hierarchy) _postMovedFromSuperview:]_block_invoke +
frame #: 0x000000010175d086 UIKit`-[UIView(Hierarchy) _postMovedFromSuperview:] +
frame #: 0x0000000101766f4b UIKit`-[UIView(Internal) _addSubview:positioned:relativeTo:] +
frame #: 0x00000001017c816f UIKit`-[UITableView _addContentSubview:atBack:] +
frame #: 0x00000001017e08cd UIKit`__53-[UITableView _configureCellForDisplay:forIndexPath:]_block_invoke +
frame #: 0x00000001017615ce UIKit`+[UIView(Animation) performWithoutAnimation:] +
frame #: 0x00000001017dff5b UIKit`-[UITableView _configureCellForDisplay:forIndexPath:] +
frame #: 0x00000001017e74cc UIKit`-[UITableView _createPreparedCellForGlobalRow:withIndexPath:willDisplay:] +
frame #: 0x00000001017c6fb1 UIKit`-[UITableView _updateVisibleCellsNow:isRecursive:] +
frame #: 0x00000001017dce3c UIKit`-[UITableView layoutSubviews] +
frame #: 0x0000000101769973 UIKit`-[UIView(CALayerDelegate) layoutSublayersOfLayer:] +
frame #: 0x00000001043efde8 QuartzCore`-[CALayer layoutSublayers] +
frame #: 0x00000001043e4a0e QuartzCore`CA::Layer::layout_if_needed(CA::Transaction*) +
frame #: 0x00000001043e487e QuartzCore`CA::Layer::layout_and_display_if_needed(CA::Transaction*) +
frame #: 0x000000010435263e QuartzCore`CA::Context::commit_transaction(CA::Transaction*) +
frame #: 0x000000010435374a QuartzCore`CA::Transaction::commit() +
frame #: 0x00000001016ee54d UIKit`-[UIApplication _reportMainSceneUpdateFinished:] +
frame #: 0x00000001016ef238 UIKit`-[UIApplication _runWithMainScene:transitionContext:completion:] +
frame #: 0x00000001016edbf2 UIKit`-[UIApplication workspaceDidEndTransaction:] +
frame #: 0x000000010480c2a3 FrontBoardServices`__31-[FBSSerialQueue performAsync:]_block_invoke +
frame #: 0x00000001034f253c CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ +
frame #: 0x00000001034e8285 CoreFoundation`__CFRunLoopDoBlocks +
frame #: 0x00000001034e8045 CoreFoundation`__CFRunLoopRun +
frame #: 0x00000001034e7486 CoreFoundation`CFRunLoopRunSpecific +
frame #: 0x00000001016ed669 UIKit`-[UIApplication _run] +
frame #: 0x00000001016f0420 UIKit`UIApplicationMain +
* frame #: 0x0000000101513903 NiuHelper`main(argc=, argv=0x00007fff5e7ac350) + at main.m:
frame #: 0x000000010844d145 libdyld.dylib`start +
看问题还以为是苹果的bug,搜索一番之后看到一个人遇到同样的问题,一个网友给出的回复是:
Sorry I never came back to this thread. So the issue is that this nib is being loaded by a view controller through its initWithNibName:bundle: method. That method will not retain any top level objects on its own. So your Highscore Controller object is loaded from the nib and then autoreleased, which means it goes away pretty quickly after that. So you need to retain that object. One easy way to do that is to define a property in your view controller subclass for this object (specifying 'retain' and 'IBOutlet' of course) and then connect that outlet to this Highscore Controller in IB.
联想到自己这里创建了一个VC,将VC的view添加到界面中就没有管这个VC了,VC被释放,看来要好好注意这种autorelease的问题了,即使是在同一个线程中还是可能存在问题。
- (TopTabPage *)TopTabControl:(TopTabControl *)tabCtrl
pageAtIndex:(NSUInteger)index
{
TopTabPage *page = [[TopTabPage alloc] initWithFrame:CGRectMake(,
,
CGRectGetWidth(self.view.frame),
CGRectGetHeight(tabCtrl.bounds) -
)]; NHNewsModel *NewsModel = [self.tagListModel.result.channelList objectAtIndex:index];
NHNewsContentViewController *contentViewVC = [[NHNewsContentViewController alloc] initWithChannelID:NewsModel.getChannelID
andContentRect:page.bounds];
[page addSubview:contentViewVC.view]; // [_array addObject:contentViewVC];
return page;
}
将VC retain之后就没有问题了。苹果的arc也不能完全相信啊。
ARC下面的对象被释放的bug的更多相关文章
- java 哪些情况下会使对象锁释放
Java_多线程_锁释放 问:Java多线程运行环境中,在哪些情况下会使对象锁释放?答:由于等待一个锁的线程只有在获得这把锁之后,才能恢复运行,所以让持有锁的线程在不再需要锁的时候及时释放锁是很重要的 ...
- GDI 对象的释放与内存泄漏的问题研究
最近写了一个GDI 绘图的程序,过程中遇到一个奇怪的问题,就是 定时器定时一会GDI绘的图就消失了..后来经过分析,原来是 GDI对象数量过多 ,即GDI对象超过10000个 导致内存泄漏的问题.找到 ...
- C#+ArcEngine中com对象的释放问题
1.问题描述 最近在写C#下AE的开发,在循环获取数据并修改时碰到了两个问题"超出系统资源"和"超出打开游标最大数":在网上看了一些资料,发现都是说在循环中没有 ...
- 对象的notify方法的含义和对象锁释放的三种情况
1,notify的含义 (1)notify一次只随机通知一个线程进行唤醒 (2)在执行了notify方法之后,当前线程不会马上释放该对象锁,呈wait状态的线程也不能马上获得该对象锁, 要等到 ...
- EasyDarwin开源流媒体服务器中一种实现对作用域内new对象自动释放的方法(值得借鉴)
我们经常在开发过程中,在局部new了一个对象,我们就会在复杂的逻辑过程中担心这个对象是否已经被释放,需要在一大堆的if.else.while.break进行判断new对象是否还存在,或者相同的dele ...
- ARC下OC对象和CF对象之间的桥接(bridge)
在开发iOS应用程序时我们有时会用到Core Foundation对象简称CF,例如Core Graphics.Core Text,并且我们可能需要将CF对象和OC对象进行互相转化,我们知道,ARC环 ...
- 对象的释放Dispose和Close对比
C#内存释放的几个方法对比: 而Close与Dispose这两种方法的区别在于,调用完了对象的Close方法后,此对象有可能被重新进行使用:而Dispose方法来说,此对象所占有的资源需要被标记为无用 ...
- TDictionary字典 对象的释放。。。
type TRen = record name: string; age: Integer; end; type TPeople = class private Fname: string; Fage ...
- 解决JQUERY在IE8,7,6下将字符串转成XML对象时产生的BUG
js 定义一个xml 对象,var data = "<Root><DataRow Id=\"1234\"/></Root>" ...
随机推荐
- Minicom配置及使用详解
因为现在电脑基本不配备串行接口,所以,usb转串口成为硬件调试时的必然选择.目前知道的,PL2303的驱动是有的,在dev下的名称是ttyUSB*. minicom,tkterm都是linux下应用比 ...
- noip 2016 提高组总结(不是题解)
小弱鸡杨树辰是第一次参加像noip这样的高大上的比赛,于是他非常,非常,非常激动. 当他第二天考完试后,他正在yy自己的分数:day1T1应该是a掉了,T2写了个30分的暴力,T3也是个40分的暴力, ...
- 安装Genymotion与集成eclipse,最后有集成android studio
本安装过程从不用到VPN 一切国内网络都可以解决. 首先下载Genymotion,网址 https://www.genymotion.com/account/login/ 首先需要注册,我使用163 ...
- hdu1036
#include<stdio.h>int main(){ int n; double d; int num; char h,m1,m2,s1,s2; scanf("%d" ...
- Struts2 注解零配置方法(convention插件使用)
最近接触到一个新的项目,是做一个使用S2SH的电子商务商城的二次开发.之前使用过S2SH,在此之前的项目中,Struts2 使用的是XML配置而这个项目是使用注解.在这个项目中,注解还不需要使用Act ...
- Python基础知识学习_Day1
1,python介绍 诞生于1989年圣诞节,目前越来越受到业界认可.应用领域十分广泛 云计算: 云计算最火的语言, 典型应用OpenStack WEB开发: 众多优秀的WEB框架,众多大型网站均为P ...
- Java版求1000以内的完全数
/* * 若一个自然数,它所有的真因子(即除了自身以外的约数)的和恰好等于它本身,这种数叫做完全数,简称完数. * 例如:6=1+2+3. * 题目:求1000以内的完全数. */ public cl ...
- 三大框架之hibernate
在DB Browser视图里新建一个数据库连接 Connection URL可填 jdbc:oracle:thin:@localhost:1521:orcl 或 jdbc:oracle:thin: ...
- javaMail邮件发送的简单实现
package com.test.mail; import java.util.Properties; import javax.mail.Message; import javax.mail.Ses ...
- HDU 5908 Abelian Period (BestCoder Round #88 模拟+暴力)
HDU 5908 Abelian Period (BestCoder Round #88 模拟+暴力) 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=59 ...