Мой сценарий заключается в том, что я выбираю одну из фотографий, извлеченных из системного альбома с помощью PhotoKit и представленных в моем UICollectionView
, и передаю выбранную фотографию (UIImage
) моему следующему UIView
и отправляю ее на удаленный сервер в виде NSData
. Но когда я поставил точку останова перед отправкой для отслеживания NSData
, я обнаружил, что у UIImage
есть данные с выделенной памятью, а у NSData
нет.
Вот код для получения UIImage
(обратите внимание, что я не указал объект PHImageRequestOptions
):
NSMutableArray *images = @[].mutableCopy;
PHImageManager *manager = [PHImageManager defaultManager];
PHAsset *asset = _photoPickerCollectionView.pickedAsset;
CGSize targetSize = CGSizeMake(asset.pixelWidth*0.5, asset.pixelHeight*0.5);
[manager requestImageForAsset:asset targetSize:targetSize contentMode:PHImageContentModeAspectFill options:nil resultHandler:^(UIImage *result, NSDictionary *info) {
_nextView.pickedOne = result;
}];
[self.navigationController dismissViewControllerAnimated:YES completion:nil];
Я конвертирую UIImage
в NSData
следующим образом:
UIImage *image = _pickedOne;
NSData *imgData = UIImageJPEGRepresentation(image, imageQuality);
Когда я отслеживал переменные, UIImage
содержит данные, как показано ниже:
Но NSData
равно nil
, как показано ниже:
И что было ODD, так это то, что если бы я указал объект PHImageRequestOptions
для PHImageManager
для запроса изображений, NSData
не был бы nil
. Я не уверен, что изменилось с PHImageRequestOptions
или без него и почему это имело бы такое значение.
ОБНОВЛЕНИЕ: Я обнаружил, что если вы укажете от PHImageRequestOptions
до nil
, то параметры по умолчанию заставят его получать фотографии асинхронно, что, на мой взгляд, может быть нестабильным для NSData
, поэтому, когда я укажу options.synchronous = YES;
, это будет работать.
Но в этом случае вызовет ли это какой-либо цикл сохранения или некоторые объекты PhotoKit
не будут освобождены?