1

これで苦労してきました、誰かが助けてくれることを願っています!投稿は初めてですが、これが私のアプリを介して私を助けるための私の頼りになるサイトであることがわかりました。

CGImageを取得し、writeImageToSavedPhotosAlbum:orientation:completionBlock:を使用してフォトライブラリにコピーするアプリがあります。機能的にはうまく機能しますが、Instrumentsは私にリークがあると言っているようです。試行錯誤とコードのコメントを通じて、この特定の行がリークを引き起こしていることがわかりました。

[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をリリースし、ライブラリもリリースします。assetOrientationは単にALAssetOrientationです。カスタムコードは他にないので、困惑しています!(問題が発生する可能性がある場合は、これを囲む他のコード行を投稿できれば幸いです)。

どんな助けでも大歓迎です!!!

4

1 に答える 1

0

私はあなたに似たコードを持っていました:

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 のコードに実際に問題がないかどうか疑問に思う.

于 2011-07-24T11:28:43.123 に答える