分配属性,ARC和Core Foundation对象

时间:2013-04-15 18:14:52

标签: objective-c automatic-ref-counting core-foundation

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

编辑。

我仍然没有得到它。我试过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

除了分析器不断报告警告外,所有编译(并且似乎运行)都很好。

本质上该代码所说的是:&#34;请ARC,不要在color做任何事情,请按照您对待其他任何方式的方式对待它{ {1}}属性,无论是BOOL还是CGFloat,我自己处理内存管理!&#34;

除非ARC拒绝听我并仍然抱怨!

我在这里看过很多关于SO的问题,但似乎没有一个问题可以解决这个问题......

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

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

出了什么问题?

1 个答案:

答案 0 :(得分:12)

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

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

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