作者uranusjr (←这人是超级笨蛋)
看板MacDev
标题Re: [问题] 遇到Crash时,除错的流程
时间Wed Aug 7 15:42:01 2013
※ 引述《Elfiend (小孩)》之铭言:
: 我知道的:
: 呼叫已经free掉的物件必定会crash掉。
: 例如某个button的TouchUpInside事件里,
: {
: UIViewController *pView;
: [self presentViewController:pView animated:YES completion:nil];
: }
: 因为pView只存在这个function里,
: 去执行presentViewController就会造成crash。
: 因为当view didload时,该view就被free了。
错, 正确原因是 pView 未初始化
UIViewController *pView; 只会宣告指标变数
你没告诉它要指向哪里, 也没初始化它指向的记忆体
当你存取它的时候就是乱存取别人的资料, 跟闯空门是一样的行为, 当然程式就死给你看
如果你有正确初始化, 在不使用 ARC 或垃圾处理的状况下
其实我猜 (没测) 光这样并不会 crash
(当然现在是另一回事, 会不会有合理行为是另一回事, 以後会不会有其他问题又是...)
: 解决的方式是在.h档里宣告全域变数,这样才不会执行完button事件,
: ViewController就被free掉了。
那也要你有正确初始化才行
没初始化的话在 ARC 设定中会自动 zero-out
我记得 presnt nil view controller 是会 crash 的...
: 我不知道的:
: 若档案A里,有button event会presentViewController 档案B,
: 而档案B里,也有button event会presentViewController 档案C,
: (就是A->B->C)
: 此时档案C里,有button event会直接返回档案A,
: [self.presentingViewController.presentingViewController dismissModalViewControllerAnimated:YES];
: 档案B跟C有使用AVPlayer,在画面一直切换的情况下,
: 可能会在档案B的presentViewController那行Crash,
: 也可能会在档案C,dismiss那行Crash,
: 这种不稳定的状况,发生原因可能是什麽?
: 因为dissmiss造成memory leak吗?
: 在拥有实机,可以看到error msg,以及machine code的情况,
: 我可以检查什麽来判断问题?
我觉得你需要找一本正规的 Cocoa/Cocoa Touch 教学, 不然你这样抓虫抓不完的
没把 C 指标与记忆体概念, 以及 OS X/iOS 记忆体管理的逻辑搞懂
就算有好的 debugger, 你每天 debug 就饱了...
我要顺便藉这篇文章 rant 一下
nil 是给 Objective-C object 空指标用的, 一般的空指标请使用 NULL
当然在实作中两个其实都是 0, 这是语意的问题
所以请写
[self presentViewController:vc animated:YES completion:
NULL];
[data writeToURL:aURL options:
0 error:
NULL];
後面那个例子, options 参数是一个 bitmask, 所以用 0 比 NULL 好
而 error 的型态是 NSError **, 所以要用 NULL
注意 NSError 是一个 Objective-C class, 所以 NSError *e = nil; 是对的
但是如果是 NSError ** 则要使用 NULL
(其实传 NULL 进去 error 参数本身就是很欠揍的行为, 不过这里只是拿来当例子)
然後我从来不知道用 Nil 的人到底是从什麽鬼地方学来的
--
╱ ̄ ̄ ̄╲
▏
◢█◣ ▏
︻█︻█ ▏
成龙表示: 是喔...
′/ ‵ ▏
╰╯ █╱
ψQSWEET ◥︶█◤
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.94.61
1F:推 kiii210:完了,我都用nil... 08/07 15:43
2F:推 roxx:推一下 nil, NULL, 0 08/07 16:11
4F:→ uranusjr:所以 Nil 是 pointer to class object, 多学了, 感恩 08/07 17:27
5F:→ nobody1:推 08/07 18:25
6F:推 NelsonT:completion是object,应该用nil比较符合语意喔 08/11 22:14