分配属性,ARC和Core Foundation对象(assign properties, ARC

2019-08-31 06:36发布

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

编辑。

我仍然不明白这一点。 我想查克建议:

@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读了很多问题,但他们都不来解决这个问题?

这里的关键,而编译器(虽然不是分析仪)似乎都同意,是通过声明属性`分配”我都声称自己处理这一切对我自己...

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

怎么了?

Answer 1:

如果您使用自动合成的getter和setter方法,的确有内存管理问题在这里。 在二传手,你CGColor需要被释放,新的值保留,但assign访问不会为你做这一点-它只是字面上的新指针值赋给变量。 你需要实现以正确地管理存储自己的存取。

但是,如果你愿意,ARC可以为你,而不是你不必自己做的处理这个问题。 只是这样声明:

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


文章来源: assign properties, ARC and Core Foundation objects