【发布时间】:2012-03-13 13:31:50
【问题描述】:
更新:从 Xcode 4.6 开始,此问题已得到修复!
此技术现在再次按预期工作。但是,在您在代码中使用它之前,请务必阅读 Rob Napier 出色答案顶部的注释。
原帖
(ARC,Xcode 4.3.1,iOS 5.1)
我有一个强大的 CF 类型 (CGImage) 属性,我想由 ARC 使用 __attribute__((NSObject)) 自动管理它(如在合成的 setter 中保留和释放,并在 dealloc 中被取消),但它不起作用:我分配属性时不会保留对象。
重现的最小示例:
@interface TestClass : NSObject
@property (nonatomic, strong) __attribute__((NSObject)) CFStringRef str;
@end
// ...In some function
CFStringRef str = (__bridge CFStringRef)[NSString stringWithFormat:@"%g", 2.5];
NSLog(@"%ld", CFGetRetainCount(str));
TestClass *obj = [[TestClass alloc] init];
obj.str = str;
NSLog(@"%ld", CFGetRetainCount(str));
两次打印“1”。
现在奇怪的是(虽然我不确定)我认为它在我更新到 iOS 5.1 和 Xcode 4.3.1(来自 iOS 5 和 Xcode 4.2)之前工作正常,并从 gdb 切换到 lldb。没有升级(或知道如何改回编译器)的人可以确认一下吗?
【问题讨论】:
-
一种解决方案就是使用
NSString *属性,并在分配时使用__bridge强制转换。 -
我没有从this link得到任何东西,希望你能得到一些东西
-
不幸的是,这只是一个重现的例子,在我使用的实际代码中,我有一个 CGImage。我会编辑帖子。
-
是的,这是真的,而且在 ARC 上也是如此,即使在 Mac 上也是如此:skitch.com/adib/8st94/arc-bug-on-corefoundation
-
似乎在 OS X 10.8.2 下的 Xcode 4.6 中已修复。编译器生成一个对
objc_setProperty_nonatomic的调用,它将objc_retain预期的新值。有人可以确认 iOS 6.1 吗?
标签: objective-c ios automatic-ref-counting core-foundation