2011-11-28 43 views
0

儀器讓我發現,我在下面的代碼泄漏:Objective-C - 泄漏在哪裏?

  CGContextMoveToPoint(c, startPoint.x, self.frame.size.height - offsetYBottom); 
      CGContextAddLineToPoint(c, startPoint.x, startPoint.y); 
      CGContextAddLineToPoint(c, endPoint.x, endPoint.y); 
      CGContextAddLineToPoint(c, endPoint.x, self.frame.size.height - offsetYBottom); 
      CGContextClosePath(c); 

      CGGradientRef myGradient; 
      CGColorSpaceRef myColorspace; 

      size_t num_locations = 2; 
      CGFloat locations[2] = { 0.0, 1.0 }; 
      CGFloat components[8] = { 0.0/255.0, 197.0/255.0, 254.0/255.0, 1.0f, 0.0/255.0, 197.0/255.0, 254.0/255.0, 0.25f }; 

      myColorspace = CGColorSpaceCreateDeviceRGB(); 
      myGradient = CGGradientCreateWithColorComponents (myColorspace, components, locations, num_locations); 

      CGPoint myStartPoint, myEndPoint; 
      myStartPoint.x = self.frame.size.width/2; 
      myStartPoint.y = 0.0; 
      myEndPoint.x = self.frame.size.width/2; 
      myEndPoint.y = self.frame.size.height; 

      CGContextSaveGState(c); 
      CGContextClip(c); 
      CGContextDrawLinearGradient (c, myGradient, myStartPoint, myEndPoint, 0); 
      CGContextRestoreGState(c); 

如果我評論這一部分,泄漏都不見了。 startPoint和endPoint是CGPoint。

負責的調用者:CGTypeCreateInstanceWithAllocator。

可能是什麼問題?

回答

3

Create Rule,你必須釋放myColorspacemyGradient當你與他們所做的:

CGColorSpaceRelease(myColorspace); 
CGGradientRelease(myGradient); 
+0

但是,這是爲什麼?有沒有用alloc的規則呢? – CristiC

+0

如果您「創建」了顏色空間或漸變,它會在封面下創建一個c對象,這是您釋放的責任。 –

+0

您在這裏處理的是CoreFoundation樣式的對象,它們的內存管理規則與Cocoa有些不同,這不是Objective-C。 – omz

1

嘗試釋放myGradient對象

CGGradientRelease(myGradient);