Ошибка памяти с блоком, когда он переводится из swift в target-c - PullRequest
0 голосов
/ 14 февраля 2019

возможно, у кого-то возникнут мысли о решении интересной проблемы.Существует метод obj-c, который я переписываю в Swift: https://pp.userapi.com/c846018/v846018818/1a0713/zsa8UZFcnfY.jpg

 + (instancetype)postUdpateTechnicianPhotoRequest:(UIImage*)image;
 {   

  ....

  SCRequest* requset =
  [IFTRequest requestWithURL:requestUrl
                httpMethod:HTTPMethodPOST
                parameters:nil
                   headers:@{ @"Content-Type" : [NSString    stringWithFormat:@"multipart/form-data; boundary=%@", boundary] }];

  [requset.updateRequestBlocksArray addObject:^(SCRequest *req) {

    [req setDataToHTTPBody:body];
  }];

  requset.hudTitle = NSLocalizedString(@"Uploading photo...", @"");
  requset.failureBlock = [requset defaultFailure];

  return requset;
  }

Получил этот метод Swift, который, скорее всего, является проблемой:

 let request = IFTRequest(url: requestUrl, httpMethod: .POST, parameters: nil, headers: ["Content-Type": "multipart/form-data; boundary=\(boundary)"])
    let updateBlock: UpdateRequestBlock = {
        $0?.setDataToHTTPBody(body)
    }

    request?.updateRequestBlocksArray.add(updateBlock)

Логикапросто, мы добавляем блок с данными в массив и затем вызываем этот блок в классе obj-c.Блок typedef:

typedef void (^UpdateRequestBlock) (SCRequest* request); 

Проблема заключается в том, что в соответствии с результатом этого блока не хватает памяти, NULL в целом.

enter image description here

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Проблема в том, что блоки Objective-C и функции Swift - это разные типы вещей.Если Swift видит, что вы передаете замыкание Swift параметру функции Objective-C, который принимает тип блока Objective-C, он преобразует замыкание Swift в блок Objective-C, поэтому он будет работать.Но здесь вы передаете его методу -addObject: из NSMutableArray, который принимает параметр типа id, который является универсальным (не специфичным для блока) типом объекта Objective-C.В этом случае нет необходимости выполнять преобразование в блок Objective-C, поскольку замыкания Swift могут быть переданы в Objective-C и использованы непосредственно как объекты Objective-C.Но этот объект Objective C, который может использоваться в Objective C, не является блоком Objective C, и вы не можете использовать его в Objective C как блок.Это просто непрозрачный объект, который оборачивает значение Swift.

Я полагаю, что если вы хотите принудительно преобразовать его в блок Objective-C при передаче его в -addObject:, вы можете сделать что-то вроде этого (яеще не проверял):

request?.updateRequestBlocksArray.addObject(myBlock as @convention(block) SCRequest -> Void)
0 голосов
/ 17 февраля 2019

Существует проблема с NSMutableArray между Swift и ObjC.Переменные записываются по-разному, и в дальнейшем могут возникнуть проблемы с объектами внутри массива.Проблема была решена путем замены NSMutableArray на NSArray.

...