【问题标题】:SKShapeNode - CGPathCreateWithRoundedRect is causing a 'Potential Leak of an object' warningSKShapeNode - CGPathCreateWithRoundedRect 导致“对象潜在泄漏”警告
【发布时间】:2015-03-18 01:26:57
【问题描述】:

我有一个 SKShapeNode,我将形状设置为 RoundedRectangle,但是当我分析代码时,我收到一条警告,指出对象可能存在泄漏。

我的界面文件如下:

#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

任何想法如何解决这个泄漏?或者是什么原因造成的?

【问题讨论】:

  • 您的泄漏可能在于您使用自定义类的方式,而不是类代码本身。

标签: memory-leaks sprite-kit skshapenode


【解决方案1】:

当您使用 Core Foundation 对象时,如果您调用函数 that*,则您拥有一个对象:

  • 在名称中嵌入“创建”;
  • 在名称中嵌入“复制”;

*但是,这不适用于返回 Objective-C 对象的方法。

如果您是对象的所有者,则必须在使用 CFRelease(或相应的特定类型变体)完成使用该对象后放弃所有权。

在 ARC 环境中,编译器不会自动管理 Core Foundation 对象的生命周期。您必须调用CFRetainCFRelease(或相应的特定类型变体)

如果你在 Objective-C 和 Core Foundation 对象之间转换,你还需要告诉编译器对象的所有权:

  • __bridge 在 Objective-C 和 Core Foundation 之间传输一个指针,但没有所有权转移;
  • __bridge_retainedCFBridgingRetain 将 Objective-C 指针转换为 Core Foundation 指针,并将所有权转移给您。您有责任调用CFRelease 或相关函数来放弃该对象的所有权;
  • __bridge_transferCFBridgingRelease 将非 Objective-C 指针移动到 Objective-C 并将所有权转移给 ARC。 ARC 负责放弃对象的所有权。

所以,在你的情况下:

path 的类型为CGPathRef,它来自采用Core Foundation 内存管理约定的Core Graphics 框架。因此,我们应用规则“如果您调用名称中嵌入了“创建”的方法 - 您拥有它”。不管是Manual(在manual中你必须)还是Automatic(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

另外,我建议您在CGPathCreateWithRoundedRect 中使用NULL 而不是nil

【讨论】:

    猜你喜欢
    • 2011-11-30
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多