2015-03-18 2 views
1

У меня есть SKShapeNode, и я устанавливаю форму как RoundedRectangle, но когда я анализирую код, я получаю предупреждение о том, что существует потенциальная утечка объект.SKShapeNode - CGPathCreateWithRoundedRect выдает предупреждение «Потенциальный утечек объекта»

Мой interfaceFile выглядит следующим образом:

#import <SpriteKit/SpriteKit.h> 

@interface letterSpace : SKShapeNode 

-(instancetype) initWithCharacter:(NSString *)character xPosition:(float)x yPosition:(float)y device:(NSString *)device; 
    @property(nonatomic, assign) BOOL occupied; 
    @property(nonatomic, assign) BOOL whiteSpace; 
    @property(nonatomic, retain) NSString *character; 
    @property (atomic) float secondLineX; 
    @property (atomic) float secondLineY; 


@end 

И тогда реализация

#import "letterSpace.h" 

@implementation letterSpace 
-(instancetype) initWithCharacter:(NSString *)character xPosition:(float)x yPosition:(float)y device:(NSString *)device{ 
    self = [super init]; 
     if(self){ 

      if ([device isEqualToString:@"IPHONE"]) { 
       [self setPath:CGPathCreateWithRoundedRect(CGRectMake(0, 0, 30, 2), 1, 1, nil)]; // Potential Leak of an object on this line 
       _secondLineX = 36*8; 
       _secondLineY = -36; 
      }else{ 
       [self setPath:CGPathCreateWithRoundedRect(CGRectMake(0, 0, 60, 3.5), 1, 1, nil)]; // Potential Leak of an object on this line 
       _secondLineX = 575; 
       _secondLineY = -71; 
      } 
      self.strokeColor = [UIColor clearColor]; 
      if ([character isEqual: @" "]) { 
       self.occupied = TRUE; 
       self.fillColor = [UIColor clearColor]; 
       self.character = character; 
       self.whiteSpace = TRUE; 
      }else{ 
       self.whiteSpace = FALSE; 
       self.occupied = FALSE; 
       self.fillColor = [UIColor colorWithRed:80.0f/255.0f 
               green:227.0f/255.0f 
                   blue:194.0f/255.0f 
                   alpha:1]; 
      } 
      if (y <8) { 
       self.position = CGPointMake(x, 0); 
      } 
      else{ 
       self.position = CGPointMake(x - _secondLineX, _secondLineY); 
      } 


      self.name = character; 
     } 
     return self; 
    } 

@end 

Любые идеи, как решить эту утечку? или что вызывает это?

+0

Ваша утечка, вероятно, в том, как вы используете свой собственный класс, а не сам класс кода. – sangony

ответ

1

При использовании объектов Ключевых Foundation, у вас есть объект, если вы звоните функцию, *:

  • есть «Создать» встраивается в имени;
  • имеют «копию», встроенную в название;

* Однако это не относится к методам, возвращающим объекты Objective-C.

Если вы являетесь владельцем объекта, вы должны отказаться от права собственности, когда закончите использовать его, используя CFRelease (или соответствующие варианты для конкретного типа).

В среде ARC компилятор автоматически не управляет временем жизни объектов Core Foundation. Вы должны вызвать CFRetain и CFRelease (или соответствующие варианты конкретного типа)

Кроме того, необходимо сообщить компилятору о праве собственности на объект, если вы накладываете между Objective-C и Основной Фонд объектов:

  • __bridge передает указатель между Objective-C и Core Foundation без передачи права собственности;
  • __bridge_retained или CFBridgingRetain направляет Objective-C указатель на указатель Core Foundation, а также передает вам право собственности. Вы несете ответственность за вызов CFRelease или связанную функцию, чтобы отказаться от владения объектом;
  • __bridge_transfer или CFBridgingRelease перемещает указатель не Objective-C в Objective-C, а также передает права собственности ARC. ARC отвечает за отказ от владения объектом.

Таким образом, в вашем случае:

path имеет тип CGPathRef, что из графического ядра рамок, ПРИНИМАЕТ конвенции управления памятью ядра Foundation. Таким образом, мы применяем правило «Если вы вызываете метод, который имеет« Create », встроенный в имя - вы его владеете». Не имеет значения, является ли это Manual (в ручном режиме) или автоматически (среда ARC не управляет автоматически жизненными целями объектов Core Foundation). Управление памятью вы должны освободить этот объект.

CGPathRef path = CGPathCreateWithRoundedRect(CGRectMake(0, 0, 30, 2), 1, 1, nil); 
[self setPath:path]; 
CGPathRelease(path); 

или вы можете использовать какао аналог bezierPathWithRoundedRect:(NSRect)rect xRadius:(CGFloat)xRadius yRadius:(CGFloat)yRadius.

Кроме того, я бы рекомендовал использовать NULL вместо nil в CGPathCreateWithRoundedRect.

 Смежные вопросы

  • Нет связанных вопросов^_^