2011-06-09 35 views
0

我想在ImageView控件上添加一個子視圖,我想我已經正確地分配了視圖和dealloc視圖。這是我的代碼。內存泄漏在iPhone中添加子視圖?

for(int Count =0; Count < [list count]; Count++) 
    { 
     MapCallout *callout = [list objectAtIndex:Count]; 

     CGSize constSize = { 700.0f, 40.0f }; 
     NSString * sTmp = [callout.Name stringByAppendingString:@"WW"]; 
     CGSize textSize = [sTmp sizeWithFont:[UIFont fontWithName:@"Arial-BoldMT" size:25.0] constrainedToSize:constSize lineBreakMode:UILineBreakModeClip]; 
     int xValue = callout.X; 
     int yValue = callout.Y; 
     int position = 0; 

     UIImage *calloutImage; 

     if(callout.Direction==0) 
     { 
      calloutImage=[UIImage newImageFromResource:@"arrow-0.png"]; 
      callout.Y=callout.Y-3; position= -3; 
     } 
     else if(callout.Direction==1) 
     { 
      calloutImage=[UIImage newImageFromResource:@"arrow-1.png"]; 
      callout.Y=callout.Y-3; position= -3; 
     } 
     else if(callout.Direction==2) 
     { 
      callout.Y=callout.Y + 2; 
      calloutImage=[UIImage newImageFromResource:@"arrow_2.png"]; 
      position= +2; 
     } 


     CalloutButton *calloutButton = nil; 

     int arraySize = [dequeueReusableCallout count] - 1; 
     if(Count > arraySize) 
     { 
      calloutButton = [[[CalloutButton alloc]initWithFrame:CGRectMake(xValue, 
                          self.tapDetectingImageView.frame.origin.y + yValue , 
                          textSize.width,40)] autorelease]; 

      [calloutButton setDelegate:self]; 

      [dequeueReusableCallout addObject:calloutButton]; 
     } 


     calloutButton = [dequeueReusableCallout objectAtIndex:Count]; 
     [calloutButton setFrame:CGRectMake(xValue, 
              self.tapDetectingImageView.frame.origin.y + yValue , 
              textSize.width,40)] ; 
     [calloutButton setBackgroundImage:calloutImage andText:callout.Name andYvalue:position]; 
     calloutButton.tag = callout.ID; 
     calloutButton.ViewMapType = [callout.calloutType intValue]; 
     calloutButton.isLive = callout.isLive; 
     calloutButton.isAnimated = callout.isAnimated; 
     [self.tapDetectingImageView addSubview:calloutButton]; 
    } 





    //Callout Button Method 


-(void) setBackgroundImage:(UIImage*)image andText:(NSString*)text andYvalue:(double)Y 
{ 

    if(!btnCallout) 
     btnCallout = [[UIButton alloc] init]; 
    [btnCallout setFrame:CGRectMake(0, -Y, self.frame.size.width, self.frame.size.height)]; 
    [btnCallout setBackgroundImage:image forState:UIControlStateNormal]; 
    [btnCallout addTarget:self action:@selector(CalloutTouch:) forControlEvents:UIControlEventTouchUpInside]; 
    [self addSubview:btnCallout]; 


    if(!lblCallout) 
     lblCallout = [[UILabel alloc] init]; 
    [lblCallout setFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; 
    lblCallout.backgroundColor = [UIColor clearColor]; 
    lblCallout.font = [UIFont systemFontOfSize:42.0]; 
    lblCallout.userInteractionEnabled = NO; 
    lblCallout.text = text; 
    lblCallout.textAlignment = UITextAlignmentCenter; 
    lblCallout.font = [UIFont fontWithName:@"Arial-BoldMT" size:25.0]; 
    [self addSubview:lblCallout]; 


} 


    [self viewForZoomingInScrollView:self.mapScrollView]; 

} 

如果我多次調用此方法方法,會發生內存警告,並且應用程序會崩潰。 在這裏,[self.tapDetectingImageView addSubview:calloutButton];我如果評論此聲明,它工作正常。請讓我知道我錯在哪裏。

回答

1

你應該叫[calloutButton release]你把它添加後的dequeueReusableCallout陣列,因爲陣列現已在新分配的實例

+0

我照你說的有保留,但沒有result.Actually我稱這種方法持續100多個時間用於測試目的,當它達到第90次點擊時,它會得到內存警告。 – Sezhian 2011-06-09 18:41:15

+0

在這種情況下,當您準備將它們添加爲子視圖時,我可能會直接分配新的calloutButton實例。這樣,您可以在添加它們之後釋放它們(因爲視圖將在該項目上保留一個保留)。我相信現在當您從數組項中添加保留計數時,您會繼續添加保留計數。所以在這種情況下,你根本不需要dequeueReusableCallout數組。如果這樣做並不能解決問題,那麼在完成這些操作後,如果沒有將它們從超級視圖中刪除,可能會有些問題。 – justin 2011-06-09 18:48:25

+0

在調用此方法之前,我已將它從superview中移除(self.tapDetectingImageView中的UIView * subView。子視圖) \t \t { \t \t \t [subView removeFromSuperview]; \t \t} – Sezhian 2011-06-09 18:54:24