2
我有一個我開發的IOS應用程序,它在模擬器和我的IPOD touch上通過xCode進行部署時效果很好。我試圖通過TestFlight與測試人員分享它;但該應用程序總是遇到SIGSEGV異常。當我通過TestFlight加載應用程序時,我的IPOD touch上發生同樣的異常;但不是當我通過我的IPOD touch上的xCode運行應用程序時。IOS應用程序通過TestFlight拋出SIGSEGV異常
我已經盡了我的努力來追蹤問題並使用遠程日誌記錄並確定了失敗的代碼行;我不清楚它爲什麼會失敗,我能做些什麼,爲什麼它通過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
從記錄語句中可以看出,異常是在嘗試訪問t時發生的他是listnerMap。看起來這個變量正被取消引用;但不清楚爲什麼或者我能做些什麼呢?
我正在使用ARC進行此應用程序。
如果您刪除與SIGSEGV註釋的行是否仍然崩潰?如果是這樣,它會在下一個'TFLog(...)'之前或之後崩潰嗎? –
它仍然崩潰,如果我刪除該行。下一個TFLog語句「檢查監聽器數組」被打印出來,但這是它崩潰之前的最後一行。 –
您可能需要在'listener(event)'前後的更多日誌記錄以及該函數的末尾。更好的是,看看你是否可以通過TestFlight獲得崩潰轉儲並將其加載到Xcode中。 –