【问题标题】:In iOS, how can I get the address of self as a string?在 iOS 中,如何将 self 的地址作为字符串获取?
【发布时间】:2014-07-15 10:13:18
【问题描述】:

如果这很重要,我尤其需要当 self 是 UIView 子类时。举例说明我的问题,以下 stmt:

NSLog(@"self: %@", self);

给出以下输出:

<RCLDataView: 0x10971a0b0; frame = (0 0; 0 0); transform = [0, 0, 0, 0, 0, 0]; alpha = 0; opaque = NO; layer = (null)>

我只想要那个地址 (0x10971a0b0) 而没有其余的文本。我想我可以(以某种方式)捕获该完整字符串并(以某种方式)使用 NSString 方法提取地址。但这似乎真的很难看。可能有办法直接获取地址,因为NSLog可以获取到。

【问题讨论】:

  • 请参阅文档以获取格式说明符。你想要%p
  • %@ 表示使用参数的description 方法(如果没有,它将使用默认的NSObject 实现)正如@rmaddy 所说,您想使用不同的格式说明符,特别是%p

标签: ios objective-c-runtime


【解决方案1】:
NSString *addressString = [NSString stringWithFormat:@"%p", yourString];

unsigned long long address = 0;
NSScanner *scanner = [NSScanner scannerWithString:addressString];

[scanner scanHexLongLong:&address];
NSLog(@"%llx", address); //Prints the address

第一行获取指针地址并将其放入NSString。 下一行实例化一个 unsigned long long 来保存指针的十六进制值。指针地址表示是64 bits 我认为 所以我们需要一个64 bit 值来保存它。我知道int 不够大,但long long 可以。或者,您可以根据您的架构使用uint64_t。接下来的两行是提取十六进制值并将其存储在我们的long long 中。 NSScanner 方法是我知道从 NSString 获取十六进制值的唯一方法,所以我就使用了它。最后一行当然是打印值以确保它是正确的。您还可以通过打印addressString 来检查它是否正确。

【讨论】:

  • 什么是 hexInt?似乎这里遗漏了一些东西。我不只是想要 addressString 作为结果吗?
  • @RobertL 这是我在测试上述代码时犯的一个错误。至于addressString,这取决于您要将地址用于什么。如果您在任何类型的 C 函数中使用它并且它需要地址参数或其他东西,那么您需要地址的原始值,因为您不能传入像 NSString 这样的 Objective-C 对象。
  • 请不要只转储代码作为答案。也添加描述。
  • unsigned long long 当然可以,但实际上有一种类型 -- uintptr_t -- 被定义为足够大以容纳地址,无论当前架构的大小如何.显然还有一个printf()/scanf() format macro for this size
猜你喜欢
  • 2022-07-25
  • 1970-01-01
  • 2017-08-30
  • 1970-01-01
  • 2021-11-30
  • 1970-01-01
  • 2019-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多