0

カメラボタンをクリックして写真を撮る空白の画面があり、その写真が空白の画面にUIVIewとして表示され、カメラから空白の画面に複数の画像を追加しています。問題は、空白の画面に複数の画像を追加できる場合もありますが、画像をキャプチャすると、空白の画面上のすべての画像が消えて現在の画像だけが表示される場合があります。そしてLOGで。受信したメモリの警告が表示されます。これは私のコードです。私は今、私のオブジェクトを適切にリリースしていると思います。しかし、最後に[オブジェクトリリース]を追加すると、アプリがクラッシュします。

   -(void)AddImagesToCanvasWithGesture{

    if(imageFromPicker.size.width > imageFromPicker.size.height || imageFromPicker.size.width == imageFromPicker.size.height)
    {
        holderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 180, 160)];
    }
    else{
        holderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 160, 240)];
    }
    UIImageView *imageview = [[[UIImageView alloc] initWithFrame:[holderView frame]];
    [imageview setImage:imageFromPicker];
    //[imageview setTag:101];
    //[holderView setTag:102];
    //NSLog(@"Tag By Default %d",(arc4random()%100)+10);
    [holderView setTag:(int)objectDelegate.tagForHolderView];
    [imageview setTag:((int)objectDelegate.tagForHolderView)+1];
    [holderView addSubview:imageview];
    //[imageview canBecomeFirstResponder];

    UIPinchGestureRecognizer *pinchRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(scale:)];
    [pinchRecognizer setDelegate:self];
    [holderView addGestureRecognizer:pinchRecognizer];

    UIRotationGestureRecognizer *rotationRecognizer = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotate:)];
    [rotationRecognizer setDelegate:self];
    [holderView addGestureRecognizer:rotationRecognizer];

    UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(move:)];
    [panRecognizer setMinimumNumberOfTouches:1];
    [panRecognizer setMaximumNumberOfTouches:1];
    [panRecognizer setDelegate:self];
    [holderView addGestureRecognizer:panRecognizer];

    UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapped:)];
    [tapRecognizer setNumberOfTapsRequired:1];
    [tapRecognizer setDelegate:self];
    [holderView addGestureRecognizer:tapRecognizer]; 


    UILongPressGestureRecognizer *gestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(gestureHandler:)];
    [holderView addGestureRecognizer:gestureRecognizer];

    [holderView.layer setBorderColor: [[UIColor whiteColor] CGColor]];
    [holderView.layer setBorderWidth: 3.0];
    [self.view addSubview:holderView];
    objectDelegate.tagForHolderView+=2;
    for(UIButton *b in self.view.subviews) {
        if([b isKindOfClass:[UIButton class]]) {
            [self.view bringSubviewToFront:b];
        }

        [self.view sendSubviewToBack:imageViewForBackground];
        //[holderView setHidden:YES];

    }

}

それらをリリースするにはどうすればよいですか。また、releaseメソッドをどこで呼び出す必要がありますか。

4

2 に答える 2

1

上で追加したコードスニペットから、オブジェクトを適切にリリースしていないことは明らかです。initARCを使用していない限り、あなたはあなたまたはretainまたはまたはcopyあなたがそれらを解放する責任があるすべてのオブジェクトを所有しています。(上記のコードはARCには問題ありません)。

すべてのジェスチャレコグナイザと画像ビューの所有権があり、不要になったらすぐに解放する必要があります。たとえば...imageViewオブジェクトは後に解放する必要があります

[holderView addSubview:imageview];

pinchRecognizer直後にリリースする必要があります

[holderView addGestureRecognizer:pinchRecognizer];

他のジェスチャ認識機能についても同じことが言えます。

コードの他の部分でも同様の問題が発生し、最終的にアプリはメモリ警告を受け取ります。

于 2012-11-27T20:38:24.270 に答える
0

メモリに問題がある場合、という名前のメソッドがある場合

- (void)didReceiveMemoryWarning

呼び出され、スペースを解放できます。ARCを使用している場合は、UIImageViewをnilに設定します。そうでない場合は、次のように呼び出します。

[imageview release];
于 2012-11-27T20:14:12.180 に答える