我已经阅读了很多关于这个问题的内容,但我似乎仍然有所不同.所以根据我的理解,EXC_BAD_ACCESS会出现内存管理问题.
事情是,我的似乎不是(!:)).问题是,我简单地在IB中添加了一个按钮,圆角矩形,没有图像.我把它与我班上定义的IBACTION联系在一起.顺便说一句,这个方法什么都不做(!).
无论如何,只要我点击按钮,应用程序崩溃就会出现"EXC_BAD_ACCESS".
就我所知,我肯定不会过度释放任何东西.有什么问题?
有线索吗?
这是我的控制台日志:
Loading program into debugger…
sharedlibrary apply-load-rules all
Program loaded.
target remote-mobile /tmp/.XcodeGDBRemote-148-79
Switching to remote-macosx protocol
mem 0x1000 0x3fffffff cache
mem 0x40000000 0xffffffff none
mem 0x00000000 0x0fff none
run
Running…
[Switching to thread 11779]
[Switching to thread 11779]
(gdb) continue
2010-01-15 09:16:34.800 FlightControl1[1899:207] Table loaded
2010-01-15 09:16:35.200 FlightControl1[1899:207] 23
2010-01-15 09:16:35.350 FlightControl1[1899:207] debug
Program received signal: “EXC_BAD_ACCESS”.
(gdb)
Run Code Online (Sandbox Code Playgroud)
在我上堆栈之后,这就是我得到的:
#0 0x31ec3ebc in objc_msgSend ()
#1 0x33605784 in -[UIApplication sendAction:to:from:forEvent:] ()
#2 0x336056ec in -[UIApplication …Run Code Online (Sandbox Code Playgroud) 
为什么它是一个exc_bad_access而不是一个run-time或compile-time错误?
我写错了"@age"而不是@"age",它激起了我的好奇心.
我所理解的exc_bad_access是:Bad-Access是由一个指针(好的引用)引起的,该指针dereferenced是一个尚未分配或解除分配或未经授权访问(const或某事)的内存位置.
但在这种情况下,我只是将数据写入内存,语法与NS Objective-c格式不匹配.因此它应该是运行时错误而不是Bad-Access.
我在哪里错过了这个概念?
据我所知,EXC_BAD_ACCESS会在您尝试访问不良内存时发生(如果我错了,请随时纠正我)?
有没有办法像在try-catchin中一样Java来防止总app失败?
A有一个视图控制器,它创建一个"下载器"对象,它有一个对视图控制器的引用(作为委托).如果成功下载项目,下载程序将回调视图控制器.只要你留在视图上,这样就行得很好,但是如果你在下载完成之前导航,我就会得到EXC_BAD_ACCESS.我理解为什么会发生这种情况,但有没有办法检查对象是否仍然被分配?我试着用测试delegate != nil,和[delegate respondsToSelector:],但它扼流圈.
if (!self.delegate || ![self.delegate respondsToSelector:@selector(downloadComplete:)]) {
// delegate is gone, go away quietly
[self autorelease];
return;
}
else {
// delegate is still around
[self.delegate downloadComplete:result];
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以,
a)让下载器对象保留视图控制器
b)在视图控制器中保留一组下载程序,并在取消分配视图控制器时将其委托值设置为nil.
但我想知道是否有一种更简单的方法,我只测试委托地址是否包含有效对象?
我们不断得到一个随机的,奇怪的崩溃NSDateFormatter.相关的堆栈跟踪是:
Program received signal: “EXC_BAD_ACCESS”.
#0 0x00000005 in ?? ()
#1 0x0213e3c3 in udat_parse ()
#2 0x01d4e1ca in CFDateFormatterGetAbsoluteTimeFromString ()
#3 0x01d4e225 in CFDateFormatterCreateDateFromString ()
#4 0x003e2608 in getObjectValue ()
#5 0x003e2921 in -[NSDateFormatter getObjectValue:forString:errorDescription:] ()
#6 0x003e21cd in -[NSDateFormatter dateFromString:] ()
Run Code Online (Sandbox Code Playgroud)
日期格式化程序仍在内存中(即未释放或损坏).我唯一能想到的是崩溃时的字符串不符合格式,但我怀疑这会使格式化程序完全崩溃.(事先检查格式是非常简单的).
有什么想法吗?
multithreading exc-bad-access objective-c nsdateformatter ios
为了在Core Data中使用,我尝试构建一个NSPredicate对象.minLength并且maxLength是类型int:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"length >= %@ AND length <= %@",
minLength, maxLength];
Run Code Online (Sandbox Code Playgroud)
程序在这里崩溃了EXC_BAD_ACCESS.如果我使用%d而不是%@:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"length >= %d AND length <= %d",
minLength, maxLength];
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么?
在UIViewController(rolePageController)中,我配置另一个UIViewController(drawerController)并从角色页面传递2个UIViews,该页面将成为drawerController配置的一部分.一旦drawerController尝试从rolePageController访问IBOutlet视图,它就会崩溃EXC_BAD_ACCESS(代码= EXC_I386_GPFLT).
在第一个VC(rolePageController)中,这里是IBOutlets:
@IBOutlet var rolePageDrawerView: UIView!
@IBOutlet var rolePageContentView: UIView!
Run Code Online (Sandbox Code Playgroud)
在rolePageController.viewDidLoad()中,我调用了抽屉控件.configureDrawer(...):
override func viewDidLoad() {
super.viewDidLoad()
//other stuff happens here
let drawerController = UIStoryboard(name: "StoryboardName", bundle: nil).instantiateViewController(withIdentifier: "drawerController") as! DrawerViewController
drawerController.configureDrawer(drawerContainerView: self.rolePageDrawerView, overlaidView: self.rolePageContentView)
//other stuff here
}
Run Code Online (Sandbox Code Playgroud)
DrawerViewController协议定义为:
protocol DrawerViewController where Self: UIViewController {
func configureDrawer(drawerContainerView: UIView, overlaidView: UIView)
}
Run Code Online (Sandbox Code Playgroud)
这是configureDrawer(...)func的代码:
private var drawerParentView: UIView!
private var overlaidByDrawerView: UIView!
func configureDrawer(drawerContainerView: UIView, overlaidView: UIView) {
self.drawerParentView = drawerContainerView
self.overlaidByDrawerView = overlaidView
}
Run Code Online (Sandbox Code Playgroud)
在调试器中注意到,调用的drawerController实例与接收调用的self实例不匹配.这是将被调用的实例的地址:
这是我进入呼叫时实例的地址:
当我进入呼叫时,呼叫前抽屉控制器的地址不是自己的地址.这绝不应该发生.
我创建了一个简化的项目,通过https://github.com/ksoftllc/DynamicStackBufferOverflow重现崩溃. …
我在运行EXC_BAD_ACCESS时遇到了一个对象,这个对象几乎没有performSelector:withObject:afterDelay选择器方法调用另一个对象而我正在释放该对象......
//我班上的某些地方,我正在打电话
[self performSelector:@selector(callObject1Function) withObject:nil afterDelay:2.0];
Run Code Online (Sandbox Code Playgroud)
我只是不明白我想当你dealloc的对象,与对象相关的一切都应该删除或取消,即使performSelector有延迟!有人可以解释一下,谢谢......
据我所知,Block就像一个对象,因为你可以向它发送复制或释放消息,例如:
[myBlock copy];
Run Code Online (Sandbox Code Playgroud)
但是每当我这样做或释放一个块时,我都会得到EXC_BAD_ACCESS.
如果我使用块函数,一切都按预期工作,例如:
Block_copy(myBlock);
Run Code Online (Sandbox Code Playgroud)
我认为释放和复制块的两种方式都是相同的?
这不是一个问题,但如果我有一个Block的属性(副本)有点烦人,我必须自己编写setter方法.
例如:使用属性:
//Header
@property (nonatomic, copy) void (^cancelledBlock)(void);
//Implementation
@sythesize cancelledBlock;
Run Code Online (Sandbox Code Playgroud)
设置时会导致EXC_BAD_ACCESS cancelledBlock
但如果我这样做:
//Header
@property (nonatomic, copy) void (^cancelledBlock)(void);
//Implementation
@sythesize cancelledBlock; //saves me doing the getter as well
- (void)setCancelledBlock:(void (^)(void))aCancelledBlock {
if (cancelledBlock == aCancelledBlock) {
return;
}
void (^oldValue)(void) = cancelledBlock;
cancelledBlock = Block_copy(aCancelledBlock);
Block_release(oldValue);
}
Run Code Online (Sandbox Code Playgroud)
没有EXC_BAD_ACCESS,一切都按预期运行.
在我的Mac OSX雪豹和xcode 4.1以及最后一个SDK上,我的应用程序在我的手机上崩溃,但在我的手机上它不会崩溃.
我有这个错误,我启动我的应用程序,等待RSS提供,并在2/3秒后崩溃:谢谢你的帮助....
Date/Time: 2011-10-07 10:15:54.675 +0200
OS Version: iPhone OS 4.3.3 (8J2)
Report Version: 104
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x2040b743
Crashed Thread: 6
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0:
0 libsystem_kernel.dylib 0x332a5c00 mach_msg_trap + 20
1 libsystem_kernel.dylib 0x332a5758 mach_msg + 44
2 CoreFoundation 0x329382b8 __CFRunLoopServiceMachPort + 88
3 CoreFoundation 0x3293a562 __CFRunLoopRun + 350
4 CoreFoundation 0x328caebc CFRunLoopRunSpecific + 224
5 CoreFoundation 0x328cadc4 CFRunLoopRunInMode + 52
6 GraphicsServices 0x33433418 GSEventRunModal + 108
7 …Run Code Online (Sandbox Code Playgroud)