2012-11-27 91 views
0

我有一個空白屏幕,我單擊相機按鈕並拍攝照片,然後將該照片作爲UIVIew出現在我的空白屏幕上,並且我將相機中的多個圖像添加到黑屏。問題是有時我可以在空白屏幕上添加多個圖像,但有時當我捕獲圖像時,並且空白屏幕上的所有圖像都消失並只顯示當前圖像。 並在LOG中。它顯示我收到內存警告。 這是我的代碼。我想我現在正確地釋放我的對象。但是當我最終添加[object release]時,我的應用程序崩潰了。IOS中的內存管理問題(接收到的內存警告)

-(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]; 

    } 

} 

我該如何釋放它們以及應該在哪裏調用釋放方法。

回答

0

當你有一個內存問題,如果你有一個名爲

- (void)didReceiveMemoryWarning 

就會被調用方法,讓你騰出空間。如果您正在使用ARC,只需將您的UIImageView到零,如果沒有,請致電:

[imageview release]; 
1

從代碼片斷你在上面添加,很明顯的你沒有正確釋放對象。你擁有你的任何物品,你initretaincopy,你有責任釋放它們,除非你使用ARC。 (上面的代碼適用於ARC)。

您擁有所有手勢識別器和圖像視圖的所有權,您應該在您不再需要它們時立即釋放它們。例如... imageView對象必須被釋放後

[holderView addSubview:imageview];

pinchRecognizer後應

[holderView addGestureRecognizer:pinchRecognizer];

同去的其他手勢識別正確的釋放。

我想你在代碼的其他部分也有類似的問題,最終應用程序收到內存警告。

+0

嗯,我做了,我已經發布了每個對象,但它仍然刪除以前的圖像從空白屏幕。 – Zohaib

+0

你可以發佈你的「空白屏幕」的代碼?沒有看到代碼就很難知道原因。 – Atif