Iphone iOS—从包含地址的NSString获取指针
如果我有一个指向地址为0x809b5c0的对象foo的指针,我可以通过调用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
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再次
超出范围时,对象被释放。