2016-05-18 13 views
0

Aus Singleton, ich versuche, den folgenden Code zu nennen, und ich bekomme den Absturz, wenn die Anforderung() -Methode Verlassen:Aufruf Objective-C-Methode mit einem zurück Block von Swift verursacht EXC_BAD_ACCESS

EXC_BAD_ACCESS Der Stapel endet mit einem swift_unknownRelease an der Spitze.

let userService = UserService() 

userService.request(user, data: data) { (dict:[NSObject : AnyObject]!, error:NSError!) in 
    if let err = error { 
    log.error("Add, delete or modified request: \(err)") 
    } 
} 

die obj-c-Methode ist:

- (void)request:(UserEntity *)userEntity data:(MyData *)data withCompletion:(void(^)(NSDictionary *dict, NSError *error))completion 
{ 
    NSString *url = [NSString stringWithFormat:@"%@?Id=%@&ype=%@",k_SERVER_REQUES, userEntity.contactID, data]; 

    NSOperation *reqOp = [self requestOperationWithMethod:@"POST" 
                 URL:url 
              withParameter:nil 
                success:^(NSInteger status, NSString *message, id data) { 
    NSError *error; 

    if (status == 1) 
    { //If no error 
     User *user = [userEntity fetchUserWithoutOverwriting]; 
     [[NSNotificationCenter defaultCenter] postNotificationName:kNotifDataChanged object:friendModel]; 
    }else{ 
     error = [NSError errorWithDomain:@"data" code:-1 userInfo:@{@"status":[NSNumber numberWithInteger:status]}]; 
    } 
    if (completion) completion(data, error); 

    } failed:^(NSString* s) { 
    if(completion) completion(nil, [NSError errorWithDomain:@"data" code:-1 userInfo:@{@"detail":s}]); 
    }]; 

    NSOperation *refreshOp = [[FeedService new] refreshProfileOperation:userEntity.contactID.longLongValue]; 

    // We are using NSOperation and dependency to ensure that refreshOp is executed before followOp. 
    // So that the changes in followOp doesn't get overwritten by the refreshOp 

    [reqOp addDependency:refreshOp]; 
    [[[AFHTTPRequestOperationManager manager] operationQueue] addOperation:refreshOp]; 
    [[[AFHTTPRequestOperationManager manager] operationQueue] addOperation:reqOp]; 
} 

Es funktioniert 99% der Zeit. aber ich habe einen Benutzer, der einen systematischen Absturz auslöst und ich weiß nicht warum, weil er identisch zu sein scheint.

aller Erstens, wenn ich den Anruf zu ändern:

userService.request(user, data: data, withCompletion: nil) 

Dann stürzt es nie. Der Absturz erfolgt also tatsächlich, wenn der Completion-Block beendet wird.

Die Werte der Parameter, wenn der Block Eingabe sind:

dict [NSObject : AnyObject]! Some 
error NSError! nil None 

Ich frage mich, warum dies geschieht und auch, warum es geschieht nur mit diesem spezifischen Benutzer ...

+0

Da 'dict' in einigen Fällen nil sein kann, sollte es nicht als implizit unwrapped optional deklariert werden. – Moritz

+0

Ich werde in userService.circleRequest (Benutzer, Kreise: Kreise) {(dict: [NSObjekt: AnyObject] ?, Fehler: NSError?) In aber die Standard-Signatur von Obj-c ist mit! In diesem Fall ist es eigentlich nicht korrekt, denke ich ... – Mikael

+0

Stürzt immer noch ab Wenn ich mich ändere! zu? Während des Anrufs von Swift – Mikael

Antwort

0

Im Objective-C in dieser Zeile Methode:

failed:^(NSString* s) { 
    if(completion) completion(nil, [NSError errorWithDomain:@"data" code:-1 userInfo:@{@"detail":s}]); 
} 

wo Sie ein leeres Dictionary und nicht nil

zur Verfügung stellen können
+0

werde ich das morgen versuchen, das könnte der Grund sein! – Mikael

+0

NSDictionary * emptyDic = [[NSDictionary alloc] init]; if (Vervollständigung) Vervollständigung (emptyDic, [NSError errorWithDomain: @ "Benutzer" code: -1 userInfo: @ {@ "Detail": s}]); Noch stürzt – Mikael

+0

das Problem ist, wenn Daten einen bestimmten Wert haben. wenn ich als Parameter nil und nil passiere, kein Problem – Mikael

0

Der Grund war: Der Server sendet manchmal kein Dictionary, sondern eine String ... Ich denke, ich sollte Mantel oder etwas ähnliches verwenden, um Anfragen Ergebnisse zu analysieren. Der Absturz ist nicht sehr explizit und die Verwendung von Address Sanitizer hat mir nicht geholfen, das Problem zu beheben.