2012-11-27 32 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