【问题标题】:How to print an Objective-C pointer with os_trace?如何使用 os_trace 打印 Objective-C 指针?
【发布时间】: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


【解决方案1】:

将指针传递给打印格式化程序的%p 参数的正确方法是将其转换为(void*)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    • 2021-10-25
    • 1970-01-01
    • 2011-01-29
    • 2023-03-12
    • 1970-01-01
    相关资源
    最近更新 更多