Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 分配属性、ARC和核心基础对象 编辑2。_Objective C_Automatic Ref Counting_Core Foundation - Fatal编程技术网

Objective c 分配属性、ARC和核心基础对象 编辑2。

Objective c 分配属性、ARC和核心基础对象 编辑2。,objective-c,automatic-ref-counting,core-foundation,Objective C,Automatic Ref Counting,Core Foundation,多亏了这一点,它现在正在发挥作用。我甚至认为我理解为什么:-) 以下是修改后的行: - (void) reCreatePath { CGMutablePathRef p = ::CGPathCreateMutable() ; ::CGPathMoveToPoint (p, 0, TL.x, TL.y) ; // [snip] ::CGPathAddLineToPoint (p, 0, BL.x, BL.y) ; ::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 = p ;
    ::CGPathRelease(p) ;   // <<== THIS IS IT!! :-)
}
像这样:

@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
除了分析仪不断报告警告外,这一切编译(并似乎运行)都很好

本质上,这段代码所说的是:“请弧,不要费心用
颜色做任何事情,请像对待任何其他
赋值
属性一样对待它,无论它是BOOL还是CGFloat,我都在自己处理内存管理!”

除了ARC拒绝听我的,而且还在抱怨

我在这里读了很多问题,但似乎没有一个能解决这个问题

这里的关键是,编译器(虽然不是分析程序)似乎同意,通过声明属性'assign',我声称自己可以处理所有的事情

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


怎么了?

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

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

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

如果你想自己管理一切,那么当然你不需要属性,你可以使用ivar创建setter和getter。我觉得分析器在这里有一点道理。你有
颜色的访问器吗?@anoop这么好的答案!你应该做出正确的回答,这样我才能接受它!:-)@chuck只要你声明一个属性,Xcode就会为你合成getter/setter。也许我可以添加一个@dynamic?但是ARC为什么还要麻烦分配属性呢?@verec:Chuck总是很好。感谢属性((NSObject))以防我想让ARC帮我管理它,但我仍然不明白为什么分配属性的设置者可以合法地做任何关于内存管理的事。ARC是否检查CF数据类型的每个赋值属性?当它看到标量时就放弃了?重点是什么?我想是静态分析仪。在
self.color=CGColorRetain(..)
中,它与
[self-setColor:CGColorRetain(..)]
相同,它不知道在
dealloc
中后期的保留是平衡的。我想我现在明白了。问题是,因为它是一个属性,KVO可以由我的实现之外的人使用它,他们不知道这个东西需要特别注意(如果他们这样做了,他们就无法提供它)。因此,按照@anoop的建议,让它成为一个没有ivar的房产可能是最安全的选择。谢谢大家澄清这一点!:)@MartinR:
\uuuuu属性(NSObject))
适用于所有CoreFoundation对象。例如,它与苹果公司的AVFoundation框架中的许多非桥接类型(如CMClock)一起使用。无论如何,如果您打算自己进行管理,那么使用setter的正确语义应该是在setter中进行内存管理。你认为我应该更清楚一点吗?你仍然要负责正确的本地内存管理。在这种情况下,您必须
cgpathlease(p)指定给属性后。该属性是正确的内存管理的,但不负责本地。
@property(nonatomic, strong) __attribute__((NSObject)) CGColorRef color;