编辑 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 的问题,但似乎没有一个能解决这个问题......
这里的关键点,编译器(尽管不是分析器)似乎同意,通过声明属性“分配”,我声称自己可以处理这一切......
所以我一定是错的,但我只是不明白为什么......
怎么了?