我尝试从异步回调中调用一个完成块 . 但有时我会遇到以下崩溃:

Thread : Crashed: com.apple.main-thread
0  libswiftCore.dylib             0x100bc58e8 swift_unknownRelease + 8
1  Appname                         0x100270370 thunk (AccountAlreadyExistsViewController.swift)
2  Appname                         0x10021a060 __52-[UserService request:withCompletion:]_block_invoke (UserService.m:1565)
3  Appname                         0x10005d2e0 __59-[NetworkService requestPost:withParameter:success:failed:]_block_invoke (NetworkService.m:63)
4  libdispatch.dylib              0x1818554bc _dispatch_call_block_and_release + 24
5  libdispatch.dylib              0x18185547c _dispatch_client_callout + 16
6  libdispatch.dylib              0x18185ab84 _dispatch_main_queue_callback_4CF + 1844
7  CoreFoundation                 0x181dc0dd8 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 12
8  CoreFoundation                 0x181dbec40 __CFRunLoopRun + 1628
9  CoreFoundation                 0x181ce8d10 CFRunLoopRunSpecific + 384
10 GraphicsServices               0x1835d0088 GSEventRunModal + 180
11 UIKit                          0x186fbdf70 UIApplicationMain + 204
12 Appname                         0x1002bc334 main (AppDelegate.swift:18)
13 libdispatch.dylib              0x1818868b8 (Missing)

代码如下:

- (void)request:(UserEntity *)userEntity withCompletion:(void(^)(NSDictionary *dict, NSError *error))completion
{

  NSString *url = [NSString stringWithFormat:@"%@?dest=%@&type=%@",k_SERVER_REQUES, userEntity.id, "abc"];

  __block NSNumber *userContactId = userEntity.id;


  [self requestPost:url withParameter:nil success:^(NSInteger status, NSString *message, id data) {
    NSError *error;
    NSMutableDictionary *rs = data;

    if (status == 1)
    { //If no error
      FriendModel *friendModel = [FriendModel friendModelWithFriend:"id1" owner:"id2"];
      PLog(@"Removing user from database");
      [friendModel remove];
    }else{
      error = [NSError errorWithDomain:@"request" code:-1 userInfo:@{@"status":[NSNumber numberWithInt:status]}];
    }
    //CRASH HERE SOMETIMES
    if (completion) completion(rs, error); 

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

}

我是否需要在异步块之前创建完成块的弱引用,然后在块中创建它的强引用?看起来有点矫枉过正 . 我的理论是,在调用异步调用之后,完成块就会被释放,并且崩溃发生......完成块不是nil,但实际上将释放内存 .

苹果推荐这样的东西......你怎么看?我该怎么写呢?

//避免保留周期// https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithObjective-CAPIs.html

EDIT

来自Swift的调用请求

myService.request(user, withCompletion: { (dict, error) -> Void in
      if let err = error {
        log.error("Add, delete or modified request: \(err)")
      }
      //This completion() block is from the current function
      completion?(response: nil, err: error)
})