网站后台是怎么做的,通过模板做网站,网站运行及维护,icp域名备案查询系统http://unmi.cc/nszombieenabled-locate-exc_bad_access-error, 来自 隔叶黄莺 Unmi Blog 我们做 iOS 程序开发时经常用遇到 EXC_BAD_ACCESS 错误导致 Crash#xff0c;出现这种错误时一般 Xcode 不会给我们太多的信息来定位错误来源#xff0c;只是在应用 Delegate 上留下像…http://unmi.cc/nszombieenabled-locate-exc_bad_access-error, 来自 隔叶黄莺 Unmi Blog 我们做 iOS 程序开发时经常用遇到 EXC_BAD_ACCESS 错误导致 Crash出现这种错误时一般 Xcode 不会给我们太多的信息来定位错误来源只是在应用 Delegate 上留下像 Thread 1: Program received signal: EXC_BAD_ACCESS让问题无从找起。 比如你对已释放的对象发送消息时就会出现EXC_BAD_ACCESS再如 release 的对象再 releaserelease 那些 autorelease 的对象等也会报这样的错。默认设置下 Xcode 不会给你定位具体是哪一行代码不该去使用已释放的对象或者 release 用错了。 比如 UIViewController 子类中这样的代码 Objective-c代码 static NSMutableArray *array; - (void)viewDidLoad { [super viewDidLoad]; array [[NSMutableArray alloc] initWithCapacity:5]; [array release]; } - (void) viewWillAppear:(BOOL)animated { [array addObject:Hello]; } 上面的代码就会出现 EXC_BAD_ACCESS 错误但我执行时 Xcode 一出错却是定位在我在 AppDelegate 的 application:didFinishLaunchingWithOptions: 方法上的某行了如果代码量多了要查找具体问题非常难只能凭经验了。 不过 NSZombieEnabled 环境变量可以帮我们的忙就是当设置NSZombieEnabled环境变量后一个对象销毁时会被转化为_NSZombie设置NSZombieEnabled后当你向一个已经释放的对象发送消息这个对象就不会向之前那样Crash或者产生 一个难以理解的行为而是放出一个错误消息然后以一种可预测的可以产生debug断点的方式消失 因此我们就可以找到具体或者大概是哪 个对象被错误的释放了。 对 Xcode 设置了 NSZombieEnabled 之后Xcode 会明确定位在行 [array addObject:Hello]然后控制台下报的错误信息是 *** -[__NSArrayM addObject:]: message sent to deallocated instance 0x6557370 如何设置 NSZombieEnabled 呢在 Xcode3 和 Xcode4 下设置不一样Xcode4 下设置很简单。 Xcode3 下 NSZombieEnabled 设置方法如下 1. 在XCode左边那个Groups Files栏中找到Executables双击其中的一项或者右键Get Info 2. 切换到Arguments 3. 这里一共有两个框在下面那个Variables to be set in the environment:点号添加一项Name里填NSZombieEnabledValue填Yes要保证前面的钩是选中的。 Xcode4 下设置 NSZombieEnabled 的方法 你可以点击 Xcode4 菜单 Product - Edit Scheme - Arguments, 然后将点击”加号”, 将 NSZombieEnabled 参数加到 Environment Variables 窗口中, 后面的数值写上 ”YES”. 或者在 Xcode4 菜单 Product - Edit Scheme - Diagnostics 设置窗口中直接勾上 Enable Zombie Objects 即可Xcode 可用 cmdshift 进到这个窗口。 Xcode4 已经考虑到了现在的要求所以提供了更便捷的设置的方式你也可以在这个窗口中设置其他一些参数你肯定能由此获得更多的帮助信息。 另外再说一下如果没有为 Xcode 设置 NSZombieEnable像下面的代码或许可以正确执行打印出你所期望的结果 “Hello”. Objective-c代码 static NSMutableArray *array; - (void)viewDidLoad { [super viewDidLoad]; array [[NSMutableArray alloc] initWithCapacity:5]; [array release]; [array addObject:Hello]; NSLog(%, [array objectAtIndex:0]); } 但是一旦加上了 NSZombieEnable 设置上面的代码行 [array addObject:Hello] 也将无法投机取巧了同样会得到错误提示 *** -[__NSArrayM addObject:]: message sent to deallocated instance 0x6557370 即使该 array 所指向的内存还是原来的数据也不能逃脱掉 NSZombieEnable 的法眼。也就是之所以未设置 NSZombieEnable 时上面代码能得到正确结果是因为虽然 [array release] 是标记为释放掉该内存块但是后面使用 array 时因为该指针指向的内存数据未被覆盖所以未出错这和 C 的指针 delete 后的效果是一样的。 转载于:https://www.cnblogs.com/DamonTang/archive/2012/08/07/2626602.html