writeImageToSavedPhotosAlbum утечки памяти? - PullRequest
1 голос
/ 19 июля 2011

У нас были тяжелые времена, надеюсь, кто-то может помочь! Новое в публикации, но я обнаружил, что это мой переходный сайт, помогающий мне в моих приложениях.

У меня есть приложение, которое берет CGImage и копирует его в библиотеку фотографий, используя writeImageToSavedPhotosAlbum: ориентация: завершениеБлок :. Функционально прекрасно работает, но инструменты, кажется, говорят мне, что у меня есть утечка. Путем проб и ошибок и комментирования кода я обнаружил, что именно эта строка вызывает утечку:

[library writeImageToSavedPhotosAlbum:myCGImage 
                              orientation:assetOrientation
                          completionBlock:^(NSURL *assetURL, NSError *error){
                              NSLog(@"image copied to album");
                          }];

Эта строка кажется мне достаточно безобидной, поэтому я действительно не уверен, почему она вызывает проблемы. Закомментировано, утечки нет. Оставьте это, я вижу утечку!

Вот что показывает инструмент в утечках:

Leaked Object   #   Address Size    Responsible Library Responsible Frame
GeneralBlock-36864,     0x8c77000   36.00 KB    MusicLibrary    MemNewPtrClear

Вот трассировка стека от Instruments, которая, кажется, подразумевает, что она действительно связана с библиотекой фотографий:

0 libsystem_c.dylib calloc
1 MusicLibrary MemNewPtrClear
2 MusicLibrary ReadITImageDB
3 MusicLibrary -[MLPhotoLibrary _loadImageLibrary]
4 MusicLibrary -[MLPhotoLibrary albums]
5 PhotoLibrary -[PLPhotoLibrary albums]
6 PhotoLibrary -[PLPhotoLibrary eventAlbumContainingPhoto:]
7 PhotoLibrary -[PLPhotoLibrary pictureWasTakenOrChanged]
8 PhotoLibrary __-[PLAssetsSaver queueJobData:requestEnqueuedBlock:completionBlock:imagePort:previewImagePort:]_block_invoke_2
9 libdispatch.dylib _dispatch_call_block_and_release
10 libdispatch.dylib _dispatch_main_queue_callback_4CF$VARIANT$up
11 CoreFoundation __CFRunLoopRun
12 CoreFoundation CFRunLoopRunSpecific
13 CoreFoundation CFRunLoopRunInMode
14 GraphicsServices GSEventRunModal
15 GraphicsServices GSEventRun
16 UIKit -[UIApplication _run]
17 UIKit UIApplicationMain
18 mogofoto main /Users/Jutsu/Documents/mogofoto2/main.m:14
19 mogofoto start

Я выпускаю myCGIImage позже, а также library , и assetOrientation - это просто ALAssetOrientation. Ничто другое не является пользовательским кодом, так что я в тупике! (Я был бы рад опубликовать мои другие строки кода, связанные с этим, если это может вызвать проблему).

Любая помощь очень ценится !!!

1 Ответ

0 голосов
/ 24 июля 2011

У меня был код похожий на ваш:

ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
NSMutableDictionary *metadata = [[NSMutableDictionary alloc] init];

/* ... set up the metadata */

[library writeImageToSavedPhotosAlbum:image.CGImage metadata:metadata
                      completionBlock:^(NSURL *assetURL, NSError *error)
 { NSLog(@"assetURL %@", assetURL);
     [metadata release];
     [library release];
 }
 ];

И я видел точно такую ​​же утечку, как и вы:

Leaked Object   Address Size    Responsible Library Responsible Frame
GeneralBlock-36864,0x5066000    36.00 KB    MusicLibrary    MemNewPtrClear
GeneralBlock-36864,0x4fd3000    36.00 KB    MusicLibrary    MemNewPtrClear
GeneralBlock-36864,0x4f72000    36.00 KB    MusicLibrary    MemNewPtrClear
GeneralBlock-36864,0x45ce000    36.00 KB    MusicLibrary    MemNewPtrClear

со стеком:

  0 libsystem_c.dylib calloc
  1 MusicLibrary MemNewPtrClear
  2 MusicLibrary ReadITImageDB
  3 MusicLibrary -[MLPhotoLibrary _loadImageLibrary]
  4 MusicLibrary -[MLPhotoLibrary albums]
  5 PhotoLibrary -[PLPhotoLibrary albums]
  6 PhotoLibrary -[PLPhotoLibrary eventAlbumContainingPhoto:]
  7 PhotoLibrary -[PLPhotoLibrary pictureWasTakenOrChanged]
  8 PhotoLibrary __-[PLAssetsSaver queueJobData:requestEnqueuedBlock:completionBlock:imagePort:previewImagePort:]_block_invoke_2
  9 libdispatch.dylib _dispatch_call_block_and_release
 10 libdispatch.dylib _dispatch_main_queue_callback_4CF$VARIANT$up
 11 CoreFoundation __CFRunLoopRun
 12 CoreFoundation CFRunLoopRunSpecific
 13 CoreFoundation CFRunLoopRunInMode
 14 GraphicsServices GSEventRunModal
 15 GraphicsServices GSEventRun
 16 UIKit -[UIApplication _run]
 17 UIKit UIApplicationMain
 18 myAppName main
 19 myAppName start

Я не вижу ничего неправильно с кодом, но при его повторном просмотре кажется глупым выделять ALAssetsLibrary и NSMutableDictionary каждый раз, когда я хочу написать изображение. Я переписал код, чтобы сохранить их, и удалил вызовы освобождения из блока завершения, и утечка волшебным образом исчезла.

Я не уверен, что что-то из этого на самом деле очень вам поможет . Но это заставляет меня задуматься, нет ли в действительности проблемы в коде Apple, который срабатывает только при определенных обстоятельствах - конечно, я не видел утечки каждого изображения, которое я писал, только некоторые из них.

...