标签: exc-bad-access

EXC_BAD_ACCESS与IBACTION

我已经阅读了很多关于这个问题的内容,但我似乎仍然有所不同.所以根据我的理解,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)

iphone exc-bad-access uibutton

24
推荐指数
1
解决办法
1万
查看次数

为什么它是"exc_bad_access"而不是"运行时"或"编​​译时"错误?

ScreenShot:xCode 5.1的运行模式

为什么它是一个exc_bad_access而不是一个run-timecompile-time错误?

我写错了"@age"而不是@"age",它激起了我的好奇心.

我所理解的exc_bad_access:Bad-Access是由一个指针(好的引用)引起的,该指针dereferenced是一个尚未分配或解除分配或未经授权访问(const或某事)的内存位置.

但在这种情况下,我只是将数据写入内存,语法与NS Objective-c格式不匹配.因此它应该是运行时错误而不是Bad-Access.

我在哪里错过了这个概念?

memory xcode exc-bad-access objective-c ios

23
推荐指数
2
解决办法
592
查看次数

有没有办法捕获或处理EXC_BAD_ACCESS?

据我所知,EXC_BAD_ACCESS会在您尝试访问不良内存时发生(如果我错了,请随时纠正我)?

有没有办法像在try-catchin中一样Java来防止总app失败?

iphone exc-bad-access objective-c ios

20
推荐指数
2
解决办法
2万
查看次数

使用委托模式时避免EXC_BAD_ACCESS

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.

但我想知道是否有一种更简单的方法,我只测试委托地址是否包含有效对象?

iphone memory-management exc-bad-access objective-c

18
推荐指数
2
解决办法
1万
查看次数

从不同的线程使用时,NSDateFormatter崩溃

我们不断得到一个随机的,奇怪的崩溃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

18
推荐指数
1
解决办法
5883
查看次数

尝试使用%@为int构建字符串时的EXC_BAD_ACCESS

为了在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)

我在这里错过了什么?

exc-bad-access objective-c

17
推荐指数
2
解决办法
3091
查看次数

即使不是nil,IBOutlet也会与EXC_BAD_ACCESS崩溃

在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 uiviewcontroller ios swift swift-protocols

17
推荐指数
2
解决办法
656
查看次数

如何删除所有performSelector:withObject:afterDelay:?

我在运行EXC_BAD_ACCESS时遇到了一个对象,这个对象几乎没有performSelector:withObject:afterDelay选择器方法调用另一个对象而我正在释放该对象......

//我班上的某些地方,我正在打电话

[self performSelector:@selector(callObject1Function) withObject:nil afterDelay:2.0];
Run Code Online (Sandbox Code Playgroud)

我只是不明白我想当你dealloc的对象,与对象相关的一切都应该删除或取消,即使performSelector有延迟!有人可以解释一下,谢谢......

iphone exc-bad-access objective-c

16
推荐指数
2
解决办法
1万
查看次数

复制或保留Block时EXC_BAD_ACCESS

据我所知,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,一切都按预期运行.

iphone exc-bad-access objective-c objective-c-blocks

16
推荐指数
1
解决办法
3513
查看次数

如何在EXC_BAD_ACCESS(SIGSEGV)上解决KERN_INVALID_ADDRESS

在我的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)

xcode exc-bad-access objective-c ios

15
推荐指数
1
解决办法
3万
查看次数