gpt4 book ai didi

objective-c - 分配属性、ARC 和 Core Foundation 对象

转载 作者:太空狗 更新时间:2023-10-30 03:57:51 26 4
gpt4 key购买 nike

编辑2.

感谢Ken现在正在工作。我什至认为我明白为什么 :-)

修改后的行:

- (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!! :-)
}

编辑。

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

@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 的问题,但似乎没有一个解决这个问题......

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

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

怎么了?

最佳答案

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

但是,如果您愿意,ARC 可以为您处理这件事,您不必自己动手。像这样声明它:

@property(nonatomic, strong) __attribute__((NSObject)) CGColorRef color;

关于objective-c - 分配属性、ARC 和 Core Foundation 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16022019/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com