2013-02-20 53 views
3

我需要的是非常简单的:获取对象的内存地址为long/long long?

不变,我们才能方式NSLog("%@",someObject);NSString* Hex = [NSString stringWithFormat:@"%p",someObject];打印someObject的内存地址的六角价值,我想它分成若干变量(使用它作为一个唯一标识符)。

任何想法如何做到这一点?任何内置方法?

+2

是啊,这是一个简单的演员。但是有龙。 – 2013-02-20 18:06:00

回答

3

其他显示如何获得地址的整数值,我想添加som considarations。

只要对象存在,指针就已经是唯一的。和sson一样,当一个对象被解除分配时,不再需要从指针派生出一个唯一的标识符。事实上它可能会造成伤害,如果你有一个分配对象的标识符,该地址已被重新使用。

通过将对象添加到某个集合或向对象本身添加一个有保证的唯一标识可以更好地跟踪对象。 UUIDs是一个很好的选择。

为实现:

-(NSString *)uuid 
{ 
    CFUUIDRef uuid = CFUUIDCreate(kCFAllocatorDefault); 
    NSString *uuidStr = (__bridge_transfer NSString *)CFUUIDCreateString(kCFAllocatorDefault, uuid); 
    CFRelease(uuid); 
    return uuidStr; 
} 
12

你不需要任何“方法”。您正在寻找的类型转换操作符:

uintptr_t pointer_as_integer = (uintptr_t)someObject; 

但你确实应该这样做。

+1

+1为警告 – vikingosegundo 2013-02-20 18:29:30

+2

为什么不?有什么问题? – 2014-10-15 12:17:28

+0

@PeterLapisu,因为它不是整数,它是一个指针。尝试打印它在控制台,你会看到这样的事情:<__ NSMallocBlock__:0x105731e0>。将它看作一个整数可能会导致由于内存访问错误导致的崩溃。 – malex 2015-03-27 15:16:44

3

您可能想要查看NSObject上的-(NSUInteger)hash方法。如果你真的想要,指针已经是整数了,十六进制只是一个读取整数的格式。

NSLog("%x",(int)someObject); 
+2

在英特尔64位平台'sizeof()!= sizeof(int)'上。如果你只是将指针指向一个int,那么你会丢失高32位。 (这是'uintptr_t'数据类型的原因。) – 2013-02-20 18:30:24

+1

请注意,'-hash'不保证为两个不同的对象返回唯一值。唯一的规定是,如果两个对象的'-isEqual:'返回true,则两个对象的'-hash'方法返回的值必须相等。 – 2013-02-20 18:33:00

+0

这应该是'NSLog(“0x%llx”,someObject);'在64位平台中。 – 2015-05-16 03:41:46