iOS - получить указатель от NSString, содержащий адрес - PullRequest
5 голосов
/ 22 апреля 2011

Если у меня есть указатель на объект foo с адресом (скажем) 0x809b5c0, я могу превратить его в строку NSString, вызвав

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

Это даст мне NSString @ "0x809b5c0".

Какой самый простой способ повернуть процесс вспять? То есть начните с fooString и верните мой указатель на foo.

Ответы [ 5 ]

9 голосов
/ 22 января 2013

В своей полноте ...

К адресной строке

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

И обратно

NSString *fooAgain;
sscanf([address cStringUsingEncoding:NSUTF8StringEncoding], "%p", &fooAgain);
3 голосов
/ 24 мая 2012

Этот фрагмент работал для меня:

NSString *pointerString = @"0x809b5c0";
NSObject *object;
sscanf([pointerString cStringUsingEncoding:NSUTF8StringEncoding], "%p", &object);
2 голосов
/ 22 апреля 2011

Преобразуйте его в целое число, затем приведите к тому типу, которым он должен быть ...

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

Тем не менее, я действительно не понимаю, зачем вам это нужно ...

1 голос
/ 01 апреля 2012

По моему опыту, проще преобразовать адрес указателя в NSInteger, например:

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

Теперь наоборот:

MyObject *otherObject=(MyObject*)adress;

Сейчас: object == otherObject

0 голосов
/ 03 мая 2015

Вместо этого используйте NSMapTable:

MyClass* p = [[MyClass alloc]init];
NSMapTable* map = [NSMapTable mapTableWithKeyOptions:NSMapTableStrongMemory valueOptions:NSMapTableStrongMemory];
[map setObject:whateverValue forKey:p];
// ...
for(MyClass* key in map) {
// ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...