Iphone iOS—从包含地址的NSString获取指针

Iphone iOS—从包含地址的NSString获取指针,iphone,objective-c,ios,pointers,Iphone,Objective C,Ios,Pointers,如果我有一个指向地址为0x809b5c0的对象foo的指针,我可以通过调用 NSString* fooString = [NSString stringWithFormat: @"%p", foo]. 这将为我提供NSString@“0x809b5c0” 逆转这一过程最简单的方法是什么?也就是说,从fooString开始,返回指向foo的指针。将其转换为整数,然后将其强制转换为任何类型 NSUInteger myInt = [ myStr integerValue ]; char * ptr

如果我有一个指向地址为0x809b5c0的对象foo的指针,我可以通过调用

NSString* fooString = [NSString stringWithFormat: @"%p", foo].
这将为我提供NSString@“0x809b5c0”


逆转这一过程最简单的方法是什么?也就是说,从fooString开始,返回指向foo的指针。

将其转换为整数,然后将其强制转换为任何类型

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

也就是说,我真的不明白为什么您需要这个…

根据我的经验,将指针地址转换为NSInteger更容易,如下所示:

MyObject *object=[[MyObject alloc]init];
//...
NSInteger adress=(NSInteger)object;
现在反过来说:

MyObject *otherObject=(MyObject*)adress;

现在:object==otherObject

这段代码对我很有用:

NSString *pointerString = @"0x809b5c0";
NSObject *object;
sscanf([pointerString cStringUsingEncoding:NSUTF8StringEncoding], "%p", &object);
就其完整性而言

到地址字符串

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

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

请改用NSMapTable:

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

我希望有一个更简单的方法。integerValue部分不太有效,因为字符串是十六进制的,但是写一个十六进制的部分并不难。但是如果你想打印指针本身的名称,这就没有用了。比如说,在一个复杂的
UIView
子类层次结构中,您想了解一个特定的UILabel,那么,您将期待标签的确切名称,而不是指向同一个mem addr的另一个指针。调试时,我可以在LLDB中使用相同的名称吗?最简单的方法是只
po string
,复制返回的内容,并说
po 0x809b5c0
或返回的任何内容。但这将给出mem addr的描述持有。如果
string
是包含内存地址的NSString,我需要指针名称:
po string
打印内存地址
po
将在该地址上打印对象。这实际上是可行的,但要注意内存管理。再次将
foo标记为
\uu不安全\u未恢复可能是明智的。当
foo再次
超出范围时,ARC将释放它。如果指针指向
foo
sscanf
将不会保留它。这意味着
foo
将是一个悬空指针,因为当
foo再次
超出范围时,对象被释放。