`
guafei
  • 浏览: 326682 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

IOS crash 总结

阅读更多
顽兔crash总结
Crash引起的原因:release一个retainCount为0的对象,一般对象的引用计数控制不当,导致内存泄露,非常容易造成程序的crash,其他的像数组越界、1/0等这种也会引起crash。顽兔期间造成crash的原因总结了下:

引用计数:
顽图客户端里面没有用ARC,所有对象的引用计数都是我们自己控制的。
只有在alloc,copy,retain三种情况下的对象的引用计数才会加1,通过release,autorelease引用计数减1。
执行release会立即使得retainCount减1,一般确定不用的对象使用。
执行autorelease延时引用计数减1,该对象不会立即被释放,而是将该对象放到自动回收池中,当最近的一个pool被释放之后,该对象才会被执行dealloc释放,有些同学可能会说,那么可以都用autorelease来处理好了,一般不这样做,比如alloc一个很大的对象,或者你执行一个for循环,每个循环里面可能都alloc了一个值,处理完了又确定不需要,那么立即释放肯定会比较好。
属性赋值:
我们看下我们在.h文件中定义一个属性userName
@property (retain,nonatomic)NSString *userName;
这个语句是自动生成属性的get set方法的,我们看下这个属性的set方法
-(void)setUserName(NSString *)userName{
[userName retain];
[_userName release];
_userName = userName;
}
发现执行set方法的时候,属性加_userName的retainCount加1了。
赋值代码self.userName = @”tbtest93”;其实就是执行了userName的set方法,所以_userName的retainCount已经加1。
赋值代码_userName = @”tbtest93”;只是简单的引用赋值而已,它的引用计数没有加1,所以在它的retainCount还是0,在函数执行完成之后对象就dealloc掉了。其它地方引用就会出问题

其它:
@property的属性如果把retain设置成assgin,那么引用计数不会加1,只是简单的赋值
@property的属性nonatomic是非原子操作,在多线程情况下需要用atomic。而且默认为atomic,当有多个属性为atomic时候,每一个属性都是访问都会锁定整个对象。
在ios5之后,支持ARC之后又了Strong和week属性,strong和retain一样,但是week和assgin有点小区别,使用week之后,属性dealloc之后,它会把指针置为nil,你调用了它的一个方法,它也不会crash。assign则不会。
delegate:
之前碰到过一个问题,是由于delegate导致的内存溢出。
在顽兔新版本的WTOtherVC.m方法中,有个成员变量WTUserInfoView,并且它的引用类型是retain,而 WTUserInfoView 有个delegate方法,这个delegate的引用类型retain类型,看下WTOtherVC 里面的方法。

{
    userInfoView.delegate = self;(WTUserInfoView retain住了这个WTOtherVC )
    ......................
self.userInfoView = userInfoView;(WTOtherVC retain住了这个WTUserInfoView )
}
这样就导致两个对象都释放不了,造成内存泄露。
看了下我们常用的tableView的delegate属性,它的引用类型也是assgin的,而不是retain,就是防止互相retain住。
viewDidunload:
在内存警告的情况下,会执行viewDidunload方法,在这个方法里面会当前被盖住的view给释放掉,如果处理不当,非常容易造成crash.一般我们会在viewDidunload里面把view设置为nil,self.xxxView=nil。一般在viewDidunload方法中不会去清空dataSource,因为下次viewDidload的时候,如果dataSource存在的话就没有必要在发起一次网络请求。
如果controller注册了NSNotification,那么返回的时候回调的方法如果没有view的相关处理,那么没有必要把这个NSNotification置为nil,但是如果对view有操作,那么必须把NSNotification给remove掉。同理Request也一样,如果回调方法没有涉及view的操作,那么Request没有必要置为nil,相反要设置为nil。一般我们都会在viewDidunload中把NSNotification,Request设置成nil。
Request:
如果你的view或者ViewController中发起了网络请求,那么你需要再viewDidunload和dealloc中把这个请求给cancel掉,因为在内存警告或者对象被释放掉时候,网络返回的数据找不到对应的处理方法,就会crash。
NSNotification:
如果你的ViewController 增加了一个Observer,那么你需要在viewDidunload和dealloc中把这个Observer移除掉,因为在内存警告或者对象被释放掉,post的notification找不到对应处理的方法,就会crash。
tableView:
tableView的delegate方法中,cell的个数或者dataSource中的数据处理不当,会导致数组越界,也容易发生crash.
Xib:我们大部分View都是用xib创建,在用xib拖拽属性到类中,会在dealloc方法里自动生成[xxx release],你重复拖的话,在dealloc里面也会重复生成[xxx release],这样就会导致一个对象在释放时重复被release,就会crash。建议在viewDidunload和dealloc方法里面把属性值统一设置为self.xxx=nil.
分享到:
评论

相关推荐

    iOS Crash文件分析方法汇总

    今天,我们将总结iOS Crash文件的几种分析方法,这些方法都是平时比较常用的,有需要的小伙伴可以参考。 方法一:使用symbolicatecrash工具 symbolicatecrash是一个命令行工具,由Apple提供,用于解析iOS Crash...

    iOS监控笔记之启动crash

    总结起来,iOS启动crash的监控涉及理解应用启动过程、识别潜在的崩溃阶段、避免类加载风险以及在C接口级别实施监控。通过hook`objc_msgSend`并手动管理寄存器,我们可以创建一个不依赖类的监控系统,有效地捕获和...

    iOS Crash常规跟踪方法及Bugly集成运用详细介绍

    总结来说,iOS Crash的跟踪不仅包括本地的日志查看,也依赖于像Bugly这样的第三方服务来提供全面的错误监控。结合两者,开发者可以更快速、更准确地定位和解决应用中的Crash问题,从而提高应用的稳定性和用户体验。

    查看iOS已上架App的Crash信息定位、应对处理方式的实例

    iOS App Crash信息定位和应对处理方式 iOS App Crash信息定位是每个开发人员所必备的技能之一,对于已经上架的App,出现Crash情况时,能够快速、准确地定位问题和解决问题是非常重要的。本文将详细介绍查看iOS已...

    iOS 数组越界 Crash处理经验.docx

    ### iOS 数组越界 Crash 处理经验 在iOS开发中,数组越界是一个常见的问题,尤其是在使用`UITableView`等控件时。当程序尝试访问数组中不存在的元素时,通常会导致程序崩溃(Crash)。本文将详细介绍如何识别、预防...

    iOS 10 适配知识点总结 - 简书1

    iOS 10 适配知识点总结 iOS 10 适配知识点总结是指在 iOS 10 系统中,开发者需要注意的一些关键点,以确保 App 的正常运行和适配。下面是 iOS 10 适配知识点总结: 1. Xcode 8.0 的使用 在 iOS 10 中,Xcode 8.0...

    iOS面试题(阿里)

    根据提供的信息,我们可以总结出这份文档是关于iOS面试题的一部分,特别强调了与阿里巴巴相关的面试题目。虽然原文中包含大量非可读字符,但通过整理和解析,我们能够提炼出以下关键知识点: ### dSYM 文件 1. **...

    iOS中多线程的经典崩溃总结大全

    iOS多线程经典崩溃总结大全 iOS开发中多线程崩溃是非常常见的,下面将总结一些经典的崩溃场景和解决方法: 1. Block回调崩溃: 在MRC环境下,使用Block来设置下载成功的图片。当self释放后,weakSelf变成野指针,...

    iOS App连续闪退时上报crash日志的方法详解

    总结来说,处理iOS App连续闪退的crash日志上报涉及多个层面,包括保证crash handler的稳定性、识别连续闪退以及确保日志安全上传。开发者需要综合运用各种策略和技术,以提供更健壮的App并及时解决问题。通过不断...

    iOS dSYM 免费下载

    总结来说,iOS dSYM是用于分析崩溃日志的关键工具,通过它我们可以将看似无意义的内存地址转换为可读的源代码位置,从而快速定位和解决问题。对于iOS开发者而言,妥善管理和使用dSYM文件至关重要,以确保能及时响应...

    iOS 5 Core Frameworks

    #### 三、iOS Frameworks 快速入门 (iOS Frameworks Crash Course) 本章节旨在快速介绍iOS框架的基本概念和技术,包括但不限于UIKit、Core Graphics等常用框架。通过这一部分的学习,读者可以对iOS开发所需的关键...

    iOS地址编译

    总结来说,"iOS地址编译"是一项关键的调试技术,它帮助开发者从奔溃日志中的地址信息定位到源代码的具体位置,从而更有效地诊断和修复问题。通过结合.dSYM文件和相应的工具,我们可以将抽象的内存地址转化为可读的...

    12.2ios调试包

    总结,"12.2ios调试包"可能包含了上述所有工具和技巧,帮助开发者在iOS 12.2环境下高效地调试和优化他们的应用。在实际工作中,开发者应充分利用这些资源,确保应用在新版本上的兼容性和性能表现。

    IOS APP测试入门

    总结来说,淘宝iOS APP测试入门的知识点涵盖了从基础的MacOSX和iOS系统知识、固件及越狱的了解,到Xcode的熟练使用以及测试类型和流程的掌握。通过这些知识点的学习,测试人员可以建立起对iOS平台测试的全面了解,...

    Xcode_ios_13.5.zip

    总结起来,Xcode_iOS_13.5.zip提供的是一个完整的iOS 13.5真机调试环境,包含Xcode的全部功能。开发者可以通过这个压缩包,快速搭建调试环境,高效地测试和优化他们的iOS 13.5应用。无论是新手还是经验丰富的开发者...

    iOS异常捕获和崩溃日志

    总结来说,iOS异常捕获和崩溃日志处理是提升应用质量不可或缺的环节。利用如ZFJUncaughtExceptionHandler这样的工具,可以有效地记录和分析崩溃信息,从而快速定位和修复问题,提供更稳定的用户体验。对于开发者而言...

    百度地图 Crash 跟踪体系及修复经验分享.pdf

    百度地图作为中国领先的地图...综上所述,百度地图分享的这份文档不仅是对百度地图自身Crash问题处理的总结,也为广大的iOS开发社区提供了一套完整的Crash处理和优化的经验,是开发者在处理App崩溃问题时的参考资料。

    符号表工具iOS版-使用指南.pdf

    ### 四、总结 符号表工具iOS版是开发者在解决iOS应用崩溃问题时不可或缺的工具之一。通过对dSYM文件的有效处理,它能够将复杂的符号信息转换为易于理解的日志格式,从而帮助开发者快速定位并解决问题。掌握其使用...

Global site tag (gtag.js) - Google Analytics