2

私は現在、オンラインチュートリアルで見つけたコードを使用して、iPhoneユーザーにカメラロールから画像を選択させています。画像の設定はUIImageView問題なく機能しますが、画像に対して関数を呼び出そうとします(スライダーを動かすたびに)。オペレーティングシステムがイメージを保持していないことが判明したため、イメージ(または作成したキャッシュ変数)にアクセスしようとすると、機能しません(アドレスがに設定されるため0x0000000)。

UIImageに準拠している場合NSCopying、これは簡単です。しかし、そうではありません。では、オペレーティングシステムがイメージを削除しないように、イメージをコピーするにはどうすればよいですか?

重複の可能性

編集:スライダーを変更すると、次の関数が呼び出されます。

- (IBAction)samplingSliderChanged:(id)sender {
    NSLog(@"%@", self.imageStay);
    float sample = self.samplingSlider.value * 0.6 + 0.2;
    self.samplingRateText.text =  [NSString stringWithFormat:@"%.0f%%", sample*100];
    //self.imageView.image = [self.brain sampleImage:self.imageStay atRate:sample];
    self.imageView.image = [self.brain sampleImage:self.imageStay.copy atRate:sample];
    NSLog(@"self.imageStay: %@, self.imageStay.copy: %@", self.imageStay, self.imageStay.copy);
}

スライダーを初めて移動したとき、my self.imageStay(キャッシュ変数)のアドレスは0x0000。です。

私のshow-the-camera-roll関数は以下のとおりです。

-(void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    NSString *mediaType = info[UIImagePickerControllerMediaType];
    UIImage * image;
    
    [self dismissViewControllerAnimated:YES completion:nil];
    
    image = info[UIImagePickerControllerOriginalImage];
    image = [self imageWithImage:image scaledToSize:CGSizeMake(256, 256)];
    self.imageView.image = image;

    if (_newMedia)
        UIImageWriteToSavedPhotosAlbum(image,
                                       self,
                                       @selector(image:finishedSavingWithError:contextInfo:),
                                       nil);
    self.imageView.image = image;
    self.imageStay = image


}

ここでは、キャッシュ変数はと同じメモリアドレスを持っており、imageこれは後で削除されると思います。

4

1 に答える 1

2

NSCopyingやUIImageのコピーを気にする必要はありませんが、これは問題ではありません。imageView内の画像への参照が失われています。OS画像を保持していますが、そうでない場合はimageViewから消えます。私はあなたがそれを正しく参照していないことを期待しています。おそらく、「キャッシング変数」が何を意味するのかを示す必要があります...

いずれにせよ、imageViewに現在表示されている画像に到達するための信頼できる方法は、imageViewのimageプロパティから画像を取得することself.imageView.imageです。

アップデート

self.imageView.imageフィルタリングの対象となる可能性があり、元の画像への参照も保持する必要がある場合(たとえば、self.imageStay)、imageStayプロパティを次のように宣言する必要があります。

@property (nonatomic, strong) UIImage* imageStay;

これを正しく実行しても、self.imageStayにnil参照がある場合は、デバッガーでコードをステップ実行して、ここで何が起こっているかを確認します。

   self.imageView.image = image;

    if (_newMedia)
        UIImageWriteToSavedPhotosAlbum(image,
                                   self,
                                   @selector(image:finishedSavingWithError:contextInfo:),
                                   nil);
    self.imageView.image = image;
    self.imageStay = image

self.imageStayこれで、self.imageView.image両方に同じオブジェクトへの参照が含まれるはずです。ちなみに、self.imageView.image = imageここでの2番目の割り当ては冗長です。

次に、- (IBAction)samplingSliderChanged:(id)senderそれらの参照が持続していることがわかります。

@property imageStay弱参照として宣言した場合、問題が発生する可能性があります。strongそれが持続することを確実にするべきです。

于 2013-01-27T00:06:57.617 に答える