4

编辑 2。

多亏了,这现在可以工作了。我什至认为我明白为什么:-)

这是修改后的行:

- (void) reCreatePath {
    CGMutablePathRef p = ::CGPathCreateMutable() ;

    ::CGPathMoveToPoint         (p, 0, TL.x, TL.y) ;
    // [snip]
    ::CGPathAddLineToPoint      (p, 0, BL.x, BL.y) ;
    ::CGPathCloseSubpath(p) ;


    self.path = p ;
    ::CGPathRelease(p) ;   // <<== THIS IS IT!! :-)
}

编辑。

我还是不明白。我尝试了 Chuck 的建议:

@property (nonatomic, strong) __attribute__((NSObject)) CGPathRef  path ;

像这样:

@interface TopLeftSlidingView  ()

@property (nonatomic, strong) __attribute__((NSObject)) CGPathRef  path ;

@end

在我重新创建 CGPath 的地方:

- (void) reCreatePath {
    CGMutablePathRef p = ::CGPathCreateMutable() ;

    ::CGPathMoveToPoint         (p, 0, TL.x, TL.y) ;
    // [snip]
    ::CGPathAddLineToPoint      (p, 0, BL.x, BL.y) ;
    ::CGPathCloseSubpath(p) ;


//    self.path = (__bridge CGMutablePathRef) p ;
//    self.path = (__bridge_transfer CGMutablePathRef) p ;
//    self.path = (__bridge_retained CGMutablePathRef) p ;
    self.path = p ;
}

三个注释掉的行中的任何一个都会导致编译器错误。未注释的行会编译,但会生成分析器警告:

/Users/verec/Projects/WordGame/WordGame/classes/TopLeftSlidingView.mm:211:26:
 Call to function 'CGPathCreateMutable' returns a Core Foundation object with
 a +1 retain count

其次是:

/Users/verec/Projects/WordGame/WordGame/classes/TopLeftSlidingView.mm:225:5:
 Object leaked: object allocated and stored into 'p' is not referenced later 
 in this execution path and has a retain count of +1

我就是不明白 :(


考虑:

@interface Test : NSObject

@property (nonatomic, assign) CGColorRef color ;

@end

@implementation Test

- (void) dealloc {
    if (self.color) {
        ::CGColorRelease(self.color) ;
        self.color = 0 ;
    }
}

- (id) init {
    if (self = [super init]) {
        self.color = ::CGColorRetain([UIColor blueColor].CGColor) ;
    }
    return self ;
}

@end

除了分析器不断报告警告之外,这一切都可以正常编译(并且看似运行)。

本质上,这段代码的意思是:“请 ARC,不要费心做任何事情color,请像对待任何其他assign属性一样对待它,无论是 BOOL 还是 CGFloat,我正在处理所有内存管理我自己一个人!”

除了 ARC 不听我的,还在抱怨!

我在这里阅读了很多关于 SO 的问题,但似乎没有一个能解决这个问题......

这里的关键点,编译器(尽管不是分析器)似乎同意,通过声明属性“分配”,我声称自己可以处理这一切......

所以我一定是错的,但我只是不明白为什么......

怎么了?

4

1 回答 1

12

如果您使用的是自动合成的 getter 和 setter,那么这里确实存在内存管理问题。在 setter 中,您的 CGColor 需要被释放并保留新值,但assign访问器不会为您执行此操作 - 它实际上只是将新指针值分配给变量。您需要实现自己的访问器才能正确管理内存。

但是,如果您愿意,ARC 可以为您处理此问题,而无需您自己动手。像这样声明它:

@property(nonatomic, strong) __attribute__((NSObject)) CGColorRef color;
于 2013-04-15T18:47:40.527 回答