- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
更新:此问题已从 Xcode 4.6 开始修复!
此技术现在再次按预期工作。但是,在您的代码中使用它之前,请务必阅读 Rob Napier 出色答案顶部的注释。
原帖
(ARC,Xcode 4.3.1,iOS 5.1)
我有一个 CF 类型 (CGImage) 的强大属性,我希望 ARC 使用 __attribute__((NSObject))
自动管理它(就像在合成 setter 中保留和释放一样,它在 dealloc 中被 nil'ed),但它不起作用:当我分配属性时,对象没有保留。
一个最小的重现示例:
@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。没有升级(或知道如何改回编译器)的人可以确认吗?
最佳答案
EDIT2(2013 年 3 月) 供对此技术感兴趣的人引用,ARC documentation for clang包括以下说明:
The use of
__attribute__((NSObject))
typedefs is not recommended. If it’s absolutely necessary to use this attribute, be very explicit about using the typedef, and do not assume that it will be preserved by language features like__typeof
and C++ template argument substitution.Rationale
Any compiler operation which incidentally strips type “sugar” from a type will yield a type without the attribute, which may result in unexpected behavior.
编辑 以下内容很有趣,但可能无关紧要。这是一个错误,您应该打开雷达。正如@lnafziger 所指出的,这是合法的,应该受到尊重。错误在于,当您包含 nonatomic
时,它不会受到尊重。如果您删除 nonatomic
,那么它就可以工作。 nonatomic
定义中没有任何内容表明这是设计使然。
这有点聪明,但我想我明白为什么它不起作用。顺便说一句,您可以通过生成汇编器并注意 setStr:
不调用 objc_storeStrong()
来确认它没有工作。它执行简单的分配。
问题是你的属性定义不符合可保留对象指针的定义(强调已加):
A retainable object pointer (or retainable pointer) is a value of a retainable object pointer type (retainable type). There are three kinds of retainable object pointer types:
- block pointers (formed by applying the caret (^) declarator sigil to a function type)
- Objective-C object pointers (id, Class, NSFoo*, etc.)
- typedefs marked with __attribute__((NSObject))
您是否按规定创建了 typedef?不,你没有。好的,那我们该怎么做呢?
typedef __attribute__((NSObject)) CFStringRef MYStringRef;
@interface TestClass : NSObject
@property (nonatomic, strong) MYStringRef str;
@end
... the rest of your code ...
这将打印“1”,然后打印“2”,正如我假设的那样。出于不明原因让我害怕,但查看汇编程序输出,一切似乎都很好,我在这里想不出任何具体问题或违规行为。
您可能有理由为此打开雷达。 typedef 未被视为与指定类型相同这一事实至少令人惊讶,即使有记录也是如此。
编辑: 注意来自 ObjC Programming Language 的@lnafziger 的评论,ARC 规范/实现中肯定存在错误,或者链接文档中存在错误,因此应该修复其中一个。
关于objective-c - 具有 __attribute__((NSObject)) 的 CF 类型的强@property 不保留,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9684972/
SWIFT代码 print("1", NSObject() == NSObject()) print("2", ObjectIdentifier(NSObject()) == ObjectIdenti
保留在 NSObject 协议(protocol)中声明。 因此NSObject类和NSProxy类实现了它。 然而 NSProxy 和 NSObject 类都有一个分配。 为什么 alloc 没有在
我有一个已在App Store中发布的应用程序。大约有1%-2%的用户报告该应用程序崩溃了。这不是完全意外的行为,因此我要求提供崩溃日志。这是最后一个异常回溯(实际显示问题的部分): Last E
我有一个自定义 NSObject 类,可以调用 People,还有一个来自 CloudMade RMMarker.h 的名为 RMMarker 的类。 RMMarker 类有一个名为 data 的属性
这是崩溃报告,不知道为什么。我使用 AFHTTPRequestOperation setCompletionBlockWithSuccess:failure: 调用电话。在完成 block 中,我得到
应用程序有时会因 [NSObject(NSObject) doesNotRecognizeSelector:] 而崩溃,选择器为 [UIImageView setImage:]。 我通过设置异常断点捕
崩溃报告: 0 CoreFoundation!__exceptionPreprocess + 0x7c 1 libobjc.A.dylib!objc_exception_throw
我正在将我的整个项目从 Objective-C 转换为 Swift...在转换时我遇到了这个问题:“无法将‘Facility’类型的值转换为预期的参数类型“Facility!” 错误出现在我提到的最后
我在将数组[String]保存到核心数据时遇到问题。在核心数据中,我设置了字段“countires”的类型 - 可转换。 我通过以下方式添加数据: filters!.countries = selec
假设您有一个返回 NSDictionary 的方法。要构建字典,您可能需要创建一个 NSMutableDictionary。返回字典的不可变副本而不是仅返回可变字典是否有任何必要或优势? 例如 - (
在一个小型 RTS 项目中,我有一个按钮列表,每个按钮都分配有一个构建对象。有些建筑物非常通用,但其他建筑物则非常特殊,因此我将某些建筑物作为子类。 当我创建一个按钮列表时,每个按钮都有一个 PEHo
这个问题在这里已经有了答案: Objective-C: Property / instance variable in category (6 个答案) Objective-C: Instance
我实际上想知道如何从 NSObject 或任何其他类访问 encodeWithCoder、init 等方法而不继承 NSObject 类。 因为我读到如果我们从 NSObject 类继承,那么它在 S
我正致力于从 Objective-C 教程转换此委托(delegate)协议(protocol)函数,但在尝试通过使用下标返回基于键的值来访问字典中的值时遇到错误。我不太确定这里的错误是什么意思。任何
在我的 Swift 应用程序中,我有一个类: open class CustomCluster : NSObject { open var coordinate = CLLocationCoo
我有一个字典/数组,看起来像这样: var myArray: [[String:NSObject]] = [] let newItem = [ [
这很奇怪,我可以使用 Xcode 5 (5A1413) 在模拟器、iPhone 4S 和 iPhone 5 中运行我的应用程序而没有任何问题,但是当我将应用程序提交到 iTunes 商店时被拒绝并且此
我使用 NSKeyedArchiver.archivedDataWithRootObject(obj) 将对象转换为 NSData。 archivedDataWithRootObject(obj) 方
背景。 请考虑以下步骤: 1) 在 Xcode 中创建一个新的“单 View 应用程序”。 2)创建类NSObject+Extension.h和.m文件: // .h @interface NSObj
在 ARC 环境中遇到一些小问题。创建一个将 View 添加到父 View 的 NSObject - 它基本上是一个可以处理一些文本并显示它的“弹出类”。 在 View Controller 中它被实
我是一名优秀的程序员,十分优秀!