Objective c IOS应用程序通过TestFlight抛出SIGSEGV异常

Objective c IOS应用程序通过TestFlight抛出SIGSEGV异常,objective-c,testflight,Objective C,Testflight,我有一个我开发的IOS应用程序,当通过xCode部署时,它在模拟器和我的iPodtouch上运行得非常好。我曾尝试通过TestFlight与测试人员共享它;但该应用程序总是遇到SIGSEGV异常。当我通过TestFlight加载应用程序时,我的IPOD touch也会出现同样的异常;但当我通过iPodtouch上的xCode运行应用程序时就不会了 我已经尽了最大努力跟踪问题,并使用远程日志记录,确定了失败的代码行;我不清楚它为什么会失败,我能做些什么,以及为什么它通过xCode而不是TestFl

我有一个我开发的IOS应用程序,当通过xCode部署时,它在模拟器和我的iPodtouch上运行得非常好。我曾尝试通过TestFlight与测试人员共享它;但该应用程序总是遇到SIGSEGV异常。当我通过TestFlight加载应用程序时,我的IPOD touch也会出现同样的异常;但当我通过iPodtouch上的xCode运行应用程序时就不会了

我已经尽了最大努力跟踪问题,并使用远程日志记录,确定了失败的代码行;我不清楚它为什么会失败,我能做些什么,以及为什么它通过xCode而不是TestFlight工作

以下是注销输出:

2012-09-16 14:46:41 TestFlight: Crash Handlers are installed
2012-09-16 14:46:41 Bootstrap
2012-09-16 14:46:41 bind settingsLoaded
2012-09-16 14:46:41 adding listeners to map
2012-09-16 14:46:41 listener map {
settingsLoaded = "{(\n)}";
}
2012-09-16 14:46:41 Loading appModel
2012-09-16 14:46:41 Loading settings
2012-09-16 14:46:41 Waiting for data to load
2012-09-16 14:46:42 TestFlight: Team Token is recognized
2012-09-16 14:46:42 Loading settings content
2012-09-16 14:46:42 Loading startScreen
2012-09-16 14:46:42 Loading jpegQuality
2012-09-16 14:46:42 Loading paperSize
2012-09-16 14:46:42 Loading showGrid
2012-09-16 14:46:42 Loading cropMode
2012-09-16 14:46:42 Loading filterType
2012-09-16 14:46:42 Loading adjustAllPages
2012-09-16 14:46:42 Loading settings complete
2012-09-16 14:46:42 triggering settings loaded
2012-09-16 14:46:42 trigger settingsLoaded
2012-09-16 14:46:42 triggerEvent settingsLoaded
2012-09-16 14:46:42 getting listeners from map
这是失败的类的头文件

#import <Foundation/Foundation.h>
#import "Gritz.h"

@interface GritzObject : NSObject {

    NSMutableDictionary *listenerMap;
}

#pragma creation

+ (GritzEvent*) create;

#pragma Events

- (void) bind:(void (^)(GritzEvent*))listener forEvent:(NSString*)name;
- (void) unbind:(void (^)(GritzEvent*))listener forEvent:(NSString*)name;
- (void) trigger:(NSString*)name;
- (void) triggerEvent:(GritzEvent*)event;

@end
#import "GritzObject.h"
#import "TestFlight.h"

@implementation GritzObject 

#pragma create

+ (GritzObject *)create {

    return [[GritzObject alloc] init];
}

- (id)init {

    self = [super init];
    if(self) {
        listenerMap = [[NSMutableDictionary alloc] init];
    }
    return self;
}

#pragma events

- (void)bind:(void (^)(GritzEvent*))listener forEvent:(NSString *)name {

    TFLog(@"bind %@", name);

    NSMutableSet* listeners = [listenerMap objectForKey:name];

    if(nil == listeners) {

        TFLog(@"adding listeners to map");

        listeners = [[NSMutableSet alloc] init];

        [listenerMap setValue:listeners forKey:name];

        TFLog(@"listener map %@", listenerMap);
    }

    [listeners addObject:listener];
}

- (void)unbind:(void (^)(GritzEvent*))listener forEvent:(NSString *)name {

    TFLog(@"unbind %@", name);

    NSMutableSet* listeners = [listenerMap objectForKey:name];

    if(nil != listeners) {
        [listeners removeObject:listener];
    }
}

- (void)trigger:(NSString *)name {

    TFLog(@"trigger %@", name);

    [self triggerEvent:[GritzEvent withName:name]];
}

- (void)triggerEvent:(GritzEvent *)event {

    TFLog(@"triggerEvent %@", event.name);

    TFLog(@"getting listeners from map");

    TFLog(@"listener map %@", listenerMap); // This throws a SIGSEGV exception

    NSMutableSet* listeners = [listenerMap objectForKey:event.name];

    TFLog(@"inspecting listeners array");

    if(nil != listeners) {

        for (void (^listener)(GritzEvent*) in listeners) {
            listener(event);
        }
    }
    else {

        TFLog(@"no listeners found for event %@", event.name);
    }
}

@end
从日志记录语句中可以看出,在尝试访问listnerMap时会发生异常。似乎该变量正在被取消引用;但不清楚为什么或者我能做些什么


我正在为此应用程序使用ARC。

在将块存储到NSSet之前,通过“复制”块修复了我遇到的问题。在将块存储到集合中之前,必须对其进行复制

我换了这行

[listeners addObject:listener];


如果删除带有SIGSEGV注释的行,它是否仍然崩溃?如果是这样,它是在下一个
TFLog(…)
之前还是之后崩溃?如果我删除该行,它仍然会崩溃。下一个TFLog语句“inspecting listeners array”已打印出来,但这是它崩溃之前的最后一行。您可能需要在
listener(event)
之前和之后以及函数末尾进行更多日志记录。更好的是,看看是否可以通过TestFlight获得崩溃转储并将其加载到Xcode中。
[listeners addObject:[listener copy]];