2012-09-16 30 views
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進行此應用程序。

+0

如果您刪除與SIGSEGV註釋的行是否仍然崩潰?如果是這樣,它會在下一個'TFLog(...)'之前或之後崩潰嗎? –

+0

它仍然崩潰,如果我刪除該行。下一個TFLog語句「檢查監聽器數組」被打印出來,但這是它崩潰之前的最後一行。 –

+0

您可能需要在'listener(event)'前後的更多日誌記錄以及該函數的末尾。更好的是,看看你是否可以通過TestFlight獲得崩潰轉儲並將其加載到Xcode中。 –

回答

1

我之前遇到的問題是在將塊存儲到NSSet之前「複製」該塊。在將塊存儲到集合中之前,它必須被複制。

我改變了這一行

[listeners addObject:listener]; 

[listeners addObject:[listener copy]]; 
相關問題