【发布时间】:2015-09-04 22:44:23
【问题描述】:
我正在尝试在 iOS 应用程序中设置 Activity Tracing,在我需要打印 Objective-C 指针之前,一切都运行良好。
在 WWDC 14 Session 714 Apple 的幻灯片中提到您可以使用%p 打印指针:
但如果不设置 ARC(或我自己),我找不到可靠的方法。
我想打印与NSManagedObject 关联的NSManagedObjectContext,因为我使用多个上下文我希望能够查看我是否将NSManagedObject 传递给意外上下文。
第一次尝试:ARC 禁止结构中的 Objective-C 对象
os_trace("doing something with object in moc %p", object.managedObjectContext);
第二次尝试:编译但不打印我想要的内容
NSManagedObjectContext *moc = invite.managedObjectContext;
os_trace("doing something with object in moc %p", &moc);
生成的跟踪打印0x16fd0e6d0 而(lldb) po invite.managedObjectContext 表示指针是0x1741fce00。
第三次尝试:我不敢相信这是唯一的方法
CFTypeRef moc = CFBridgingRetain(object.managedObjectContext);
os_trace("doing something with object in moc %p", moc);
CFRelease(moc);
这会打印出我期望的地址。但是 OMG 不得不手动保留/释放一些东西来打印内存地址是可怕的。
我错过了什么?必须有更好的方法来做到这一点。
【问题讨论】:
-
当你说“这不是我想要的”时,你定义了
NSManagedObjectContext *moc,也许你应该将moc作为参数传递给格式spec%p,而不是&moc。跨度> -
@WeatherVane 如果我这样做,我会得到同样的错误 O 在第一次尝试版本时获得。
-
我相信
(void*)moc是正确的。 -
@WeatherVane 你是对的,还有一点,因为我们需要在 ARC 中铸造一座桥,所以
(__bridge void *)moc -
@WeatherVane 随意添加它作为答案,我会将其标记为正确。顺便说一句,void cast 也适用于第一次尝试代码。
标签: ios objective-c c automatic-ref-counting activity-tracing