ios - 踩在 block 处理程序的 "EXC_BAD_ACCESS KERN_INVALID_ADDRESS"上

标签 ios crash objective-c-blocks

我有生产代码,我发现它偶尔会因 block 处理程序上的 EXC_BAD_ACCESS KERN_INVALID_ADDRESS 崩溃。我可以用我的一生找出我的代码出了什么问题。我试图重现这一点,但无法在我的受控环境中重现。这是剥离和清理的代码:

代码片段:

typedef void (^TestCallBackHandler)(NSString* location, NSError* error);

@interface _TestClass : NSObject

@property (nonatomic, copy) TestCallBackHandler handler;
@property (nonatomic, strong)NSTimer *endTimer;

- (void)fireOneOff:(TestCallBackHandler)handler;

@end

@implementation _TestClass

- (void)fireOneOff:(TestCallBackHandler)handler
{
    _handler = handler;

    NSLog(@"** New %p %@ Incoming %p, %@ Ours %p %@",self,self,handler, handler, _handler, _handler);
    _endTimer = [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(_stop) userInfo:nil repeats:NO];
}

- (void)dealloc
{
    NSLog(@"%@ Dealloced",self);
    _handler = nil;
}

- (void)_stop
{
    NSLog(@"** Stopping ? %@",self);
    if (_handler)
        _handler([NSString stringWithFormat:@"Hello %@",[NSDate date]], nil);
}

@end

我的类中的调用代码定义为:

@property (nonatomic, strong)_TestClass *testClassInstance;

并这样调用:

- (void)startTestClass {
    _testClassInstance =  [[_TestClass alloc] init];
    [_testClassInstance fireOneOff:^(NSString *newString, NSError *error) {
    NSLog(@"Got new String! %@",newString);
    _testClassInstance = nil;
}];
}

有几点需要注意:

  • startTestClass 可以被多次调用
  • 应用程序在后台唤醒,并且可以创建它。

任何指示,非常感谢。我只是不能 Handlebars 指放在这段代码中并说这是错误的。请帮忙!

最佳答案

两个提示对我来说有点奇怪:

首先:为什么要在对象自己的 block 中将对象设置为 nil。

- (void)startTestClass {
        _testClassInstance =  [[_TestClass alloc] init];
        [_testClassInstance fireOneOff:^(NSString *newString, NSError *error) {
        NSLog(@"Got new String! %@",newString);
        _testClassInstance = nil;
    }];
}

其次,您的对象可能已经被释放,并且 NSTimer 正在尝试在释放对象上执行方法

- (void)fireOneOff:(TestCallBackHandler)handler
{
    _handler = handler;

    NSLog(@"** New %p %@ Incoming %p, %@ Ours %p %@",self,self,handler, handler, _handler, _handler);
    _endTimer = [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(_stop) userInfo:nil repeats:NO];
}

我也不明白代码到底做了什么以及为什么。我相信对于您在本类(class)中所取得的成就来说,会有一个更简单、更好维护的解决方案。

关于ios - 踩在 block 处理程序的 "EXC_BAD_ACCESS KERN_INVALID_ADDRESS"上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39614221/

相关文章:

ios - 点击 swift 时 tableviewcell 打开 url

C++ 简单的崩溃日志记录

ios - 如何返回方法的输出是使用 NSURLConnection 异步调用 block

ios - 需要帮助理解部分块

objective-c - 如何将基于委托(delegate)的回调系统转换为基于 block 的?

ios - 我们可以从我们的 ios 应用程序启动我们的应用程序设置页面吗?

android - 如何返回Future <object>并将其分配给object,flutter

iphone - iPhone 的静态应用程序

java - java应用程序和远程数据库的问题

crash - 尝试启动内核调试器时 Visual Studio 崩溃