У меня есть некоторый код 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
с дугой?
Из вопроса не ясно, что у вас есть или что вы пробовали, так что вот тривиальный пример, который работает, и, возможно, вы можете выяснить вашу проблему по нему:
@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
НТН
Вы не показываете нам все, но обычно, если MyType*
это тип self
ты должен просто сделать
Proc((intptr_t)self);
а также
MyType *refToSelf = (MyType*)(intptr_t)UserData;