在iOS中,如何将self的地址作为字符串?

时间:2014-07-14 03:50:58

标签: ios objective-c-runtime

如果重要,我需要这个,特别是当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可以获得它。

1 个答案:

答案 0 :(得分:2)

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。 下一行实例化一个无符号长long来保存指针的十六进制值。指针地址表示为64 bits 我认为所以我们需要一个64 bit值来保存它。我知道int不够大,但long long有效。或者,您可以使用uint64_t,具体取决于您的架构。接下来的两行是提取十六进制值并将其存储在long long中。 NSScanner方法是我知道从NSString获取十六进制值的唯一方法所以我只是使用它。最后一行当然是打印值以确保它是正确的。您还可以打印addressString

来检查是否正确