4

簡単な概念的な質問、

UIImagePickerController を使用していて、didFinishPickingMediaWithInfo を実装していない場合、または写真が「撮影」された後に返された UIImage を処理しようとした場合、デリゲート呼び出し中に返されたはずの UIImage データはどうなりますか?システム?

テスト後、標準の写真ライブラリに漏れたり追加されたりすることはないようです。

ありがとう、

4

1 に答える 1

1

そもそもなんで漏れるのかわからない。

Apple 開発者が作成したコードは、デリゲートの呼び出しが完了すると、カメラが撮影した画像を確実にリリースするようになっていると考えてください。たとえば、これが開発者がどのように見えるかを考えてみましょう (ARC の前に、これを行うのに ARC さえ必要ないことを示します)。

- (IBAction)userDidPressAccept:(id)sender
{
    // Obtain image from wherever it came from, this image will start with
    // Retain Count: 1
    UIImage *image = [[UIImage alloc] init]; 

    // Build an NSDictionary, and add the image in
    // Image Retain Count: 2
    NSDictionary *userInfo = [[NSDictionary alloc] initWithObjectsAndKeys:image, UIImagePickerControllerOriginalImage, ..., nil];

    // Now the dictionary has ownership of the image, we can safely release it
    // Image Retain Count: 1
    [image release];

    if ([self.delegate respondsToSelector:@selector(imagePickerController:didFinishPickingMediaWithInfo:)])
    {
        // Guy sees what he does with his image
        // Image Retain Count: X (Depends on the user)
        [self.delegate imagePickerController:self didFinishPickingMediaWithInfo:image];
    }

    // Ok, we're done. Dictionary gets released, and it can no longer own the image
    // Image Retain Count: X-1 (Depends on the user)
    [userInfo release];
}

この例では、ユーザーが画像を作成しなかっretainた (またはメソッドを実装していなかった) 場合、X は 1 になり、最終的に到達releaseすると、画像は永久に消えます。ユーザーが画像を保持する場合、画像は存続しますが、それをサポートする辞書は削除される可能性がdeallocあります。

これが参照カウントに伴う「所有権」の基本的な考え方で、ガラス玉を手で渡すようなもので、手が下にないとボールが落ちて壊れてしまいます。

ARC はそれ自体を実行することでこれらすべてを覆い隠しますが、基本的な概念は残り、所有権はデリゲートの実装に移され、所有権を主張するデリゲートが存在しない場合は削除されます。

于 2013-07-19T07:32:08.983 に答える