2011-04-22 7 views
5

Si tengo un puntero a un objeto foo con la dirección (por ejemplo) 0x809b5c0, que puede convertir eso en un NSString llamandoIOS - obtener un puntero desde un NSString que contiene la dirección

NSString* fooString = [NSString stringWithFormat: @"%p", foo]. 

Esto me dará la NSString @ "0x809b5c0".

¿Cuál es la forma más fácil de revertir el proceso? Es decir, comienza con fooString y recupera mi puntero a foo.

Respuesta

2

Convertir en un número entero, y luego convertirlo a cualquier tipo que se supone que es ...

NSUInteger myInt = [ myStr integerValue ]; 
char * ptr  = (char *)myInt; 

Dicho esto, yo realmente no entiendo por qué se necesita este ...

+0

que estaba esperando allí sería una manera más fácil. La parte integerValue no funciona del todo ya que la cadena es hexadecimal, pero escribir una que sí lo haga no es difícil. –

1

En mi experiencia es más fácil de convertir la dirección del puntero a un NSInteger, así:

MyObject *object=[[MyObject alloc]init]; 
//... 
NSInteger adress=(NSInteger)object; 

ahora que cambiar:

MyObject *otherObject=(MyObject*)adress; 

Ahora: == objeto otherObject

+0

Pero si desea imprimir el nombre del puntero, esto no será útil. Digamos en una jerarquía compleja de subclases 'UIView', le gustaría saber sobre un UILabel particular, luego estaría esperando el nombre exacto de la etiqueta en lugar de otro puntero al mismo 0rr0r –

3

Este fragmento de código que funcionó para mí:

NSString *pointerString = @"0x809b5c0"; 
NSObject *object; 
sscanf([pointerString cStringUsingEncoding:NSUTF8StringEncoding], "%p", &object); 
9

En su integridad ...

Para abordar cuerdas

NSString *foo = @"foo"; 
NSString *address = [NSString stringWithFormat:@"%p", foo]; 

y vuelta

NSString *fooAgain; 
sscanf([address cStringUsingEncoding:NSUTF8StringEncoding], "%p", &fooAgain); 
+0

de la memoria. ¿Cómo puedo usar el mismo en LLDB mientras se depura? –

+0

Lo más fácil sería simplemente 'po string' y copiar lo que se devuelve y decir' po 0x809b5c0' o lo que fue devuelto. – hfossli

+0

Pero eso me dará la descripción que mem addr tiene. Quiero el nombre del puntero \ –

0

utilizar un NSMapTable lugar:

MyClass* p = [[MyClass alloc]init]; 
NSMapTable* map = [NSMapTable mapTableWithKeyOptions:NSMapTableStrongMemory valueOptions:NSMapTableStrongMemory]; 
[map setObject:whateverValue forKey:p]; 
// ... 
for(MyClass* key in map) { 
// ... 
} 
Cuestiones relacionadas