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 ...
Da 'dict' in einigen Fällen nil sein kann, sollte es nicht als implizit unwrapped optional deklariert werden. – Moritz
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
Stürzt immer noch ab Wenn ich mich ändere! zu? Während des Anrufs von Swift – Mikael