http://article.ityran.com/archives/1143
这篇文章真的很好,昨晚加班回来十点多了,顶着巨困看完的,真刁丝日子就是不易啊,今天看完电影回来趁着感觉还比较新鲜,赶紧把这篇读后感写下来。
当然文中的,nslong,和断点调试,本来就会了。
1.Zombies这招,今天上班调试一个内存泄露的问题,小试锋芒,觉得还是比较给力的。
2.我可以用 po p命令,这样方便的地方就是你可以省略很多额外增加NSLog()的步骤和从新编译这个app。(这个解开了,我在看系列第一篇的时候的一个疑惑)
你也可以在调试窗口的左边看到这些变量,但是就算看到了也不是很方便就能知道细节的,(这点让我觉得很坑爹,还是又有我理解不到位的地方?)
原文总结的很好了,我拷贝一下
秘诀:
1.假如崩溃在main.m里面,就可以设置全局异常断点(Exception Breakpoint)。
2.在异常断点开启的状态下,你也没有得到得到有用的信息。在这种情况下,多继续几次运行这个app,或者在调试提示后面输入“po $eax”命令。
3.大多数崩溃的一般原因和一些bug都是在你的xib中或者storyboard中的连接丢失了或者是错误的连接。这些情况不会在编译错误里面显示,因此你一般不知道。
4.不要忽略编译警告。假如你有编译警告,就说明你有些东西可能会出错。假如你不知道为什么你会到一个编译警告,最好去搞明白它. 这些都是安全的做法!
5.在设备上调试可能会和在模拟器上面有些微的不同。这两个环境不是完全一样,你将会得到不同的结果。
例如,当你运行一个有问题的程序在iphone4上的时候,这第一个崩溃就会发生在NSArray初始化的时候,因为你缺少一个nil标记,而不是会因为当这个app执行setList:的时候的时候崩溃。所以说上面那个原则方法就可以帮你找到崩溃问题的根源本质。
不要忘记静态分析工具(static analyzer tool),这个工具将会捕获更多的错误。假如你是一个初学者,推荐你开启它。你可以在Build Settings界面上为你的工程设置:
血的教训啊,
血的教训啊,
血的教训啊,
血的教训啊,
myKeys = [[NSArray alloc]initWithObjects:@"ImageFileName",@"TitleText",@"DetailText", @"link","number",@"currency",nil];
就停在这句话报的错是,exc_bad_access。你能看出来什么错吗?
我花了一天时间,以为是过度释放,结果,到后来发现不是这么回事,所以,如果你是初学者,打开他吧,xcode会给你提示的
自己不明白的放在最后
list = [NSMutableArray arrayWithCapacity:10];
由于这里不是ARC(Automatic Reference Counting)(自动引用计数)项目,所以是人工管理内存,所以这里你需要retain这个变量:
// in initWithCoder: list = [[NSMutableArray arrayWithCapacity:10] retain];
为了避免内存泄露,你也不得不在dealloc函数中释放这个对象,就像下面这个: