2013-02-20 4 views
3

Что мне нужно довольно просто:Получить адрес памяти объекта как длинный/длинный?

Точно так же мы можем NSLog("%@",someObject); или NSString* Hex = [NSString stringWithFormat:@"%p",someObject]; для печати шестигранной значения адреса памяти someObject «s, я хочу, чтобы получить его в переменный номере (чтобы использовать его в качестве уникальный идентификатор).

Любая идея, как это можно сделать? Какие-нибудь встроенные методы?

+2

Да, это простой бросок. Но есть драконы. –

ответ

3

Другие показали, как получить целочисленное значение адреса, я хочу добавить som considarations.

Пока объект живет, указатель уже уникален. и как sson, поскольку объект get deallocated, больше не используется для уникального идентификатора, полученного из указателя. infact это может нанести вред, если у вас есть идентификатор выделенного объекта, адрес которого уже повторно используется.

лучше отслеживать объект, добавляя его в какую-либо коллекцию или добавляя гарантированный уникальный идентификатор самому объекту. 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

+2

почему нет? в чем проблемы? –

+0

@PeterLapisu, потому что он не является целым, это указатель. Попробуйте распечатать его в консоли, и вы увидите что-то вроде этого: <__ NSMallocBlock__: 0x105731e0>. Понимание этого как целого может привести к сбоям из-за неправильного доступа к памяти. – malex

3

Вместо этого вы можете посмотреть метод -(NSUInteger)hash на NSObject. Если вы действительно этого хотите, указатели уже являются целыми числами, а hex - это просто формат для чтения целого числа.

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

На 64-битной платформе Intel 'sizeof ()! = Sizeof (int)'. Вы потеряете верхний 32-разрядный бит, если вы просто нажмете указатель на int. (Это причина для типа данных 'uintptr_t'.) –

+1

Обратите внимание, что' -hash' не гарантированно возвращает уникальное значение для двух разных объектов. Единственное условие заключается в том, что если '-isEqual:' возвращает true для двух объектов, значения, возвращаемые методом '-hash' обоих объектов, должны быть равны. –

+0

Это должно быть 'NSLog (« 0x% llx », someObject);' в 64-битной платформе. –

Смежные вопросы