Разыменование self в функции C с ARC, ссылка передается как intptr_t

У меня есть некоторый код Objective-C, который должен работать с функцией C. «UserData» функции имеет тип long, Мне нужно использовать это, чтобы передать ссылку на selfвот так я передаю это так:

Proc((intptr_t) self);

Чистое решение на другом конце будет выглядеть так:

int Proc(long UserData) {
MyType *refToSelf = (MyType*)(intptr_t)UserData;
}

Но это не разрешено ARC: «Преобразование« intptr_t »(он же« long ») в« MyType * »запрещено ARC»

Функция C объявлена ​​внутри MyTypeЭто реализация, поэтому мне не нужно ее сохранять. Как я могу получить свою ссылку в и из long с дугой?

0

Решение

Из вопроса не ясно, что у вас есть или что вы пробовали, так что вот тривиальный пример, который работает, и, возможно, вы можете выяснить вашу проблему по нему:

@interface Basic : NSObject

- (void) identify;

@end

@implementation Basic

- (void) identify
{
NSLog(@"Basic instance: %p", self);
}

@end

@implementation AppDelegate

void cFunction(long UserData)
{
Basic *bp = (__bridge Basic *)(void *)UserData; // cast to void * then bridge without
// transferring ownership to the ARC world
[bp identify];
}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
NSAssert(sizeof(long) == sizeof(void *), @"can't work, sizes don't match");

Basic *b = [Basic new];
cFunction((long)(__bridge void *)b); // bridge to the C world without retaining
// or transferring ownership then cast as long
[b identify];
}

@end

НТН

1

Другие решения

Вы не показываете нам все, но обычно, если MyType* это тип self ты должен просто сделать

Proc((intptr_t)self);

а также

MyType *refToSelf = (MyType*)(intptr_t)UserData;
0

По вопросам рекламы [email protected]