2013-02-20 86 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