获取对象的内存地址长/长?

时间:2013-02-20 18:02:01

标签: objective-c cocoa

我需要的是非常简单的:

我们可以NSLog("%@",someObject);NSString* Hex = [NSString stringWithFormat:@"%p",someObject];打印someObject内存地址的 hex 值的方式相同,我想把它变成一个数字变量(将其用作唯一标识符)。

知道如何做到这一点?有任何内置方法吗?

3 个答案:

答案 0 :(得分:12)

您不需要任何“方法”。你正在寻找演员:

uintptr_t pointer_as_integer = (uintptr_t)someObject;

但你真的不应该这样做。

答案 1 :(得分:3)

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

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

答案 2 :(得分:3)

其他人展示了如何获取地址的整数值,我想添加som considarations。

只要对象存在,指针就已经是唯一的。并且作为sson,当一个对象被取消分配时,不再使用从指针派生的唯一标识符。如果你有一个已分配对象的标识符,那么它可能会造成伤害,该地址已被重用。

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

该实现:

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