Преобразование типа и вызывает ошибку компилятора
в среде ARC у меня есть следующий код:
NSInvocation* invocation = [NSInvocation invocationWithMethodSignature:signature];
[invocation setTarget:delegate];
[invocation setSelector:@selector(restClient:loadedFile:contentType:eTag:)];
// Error Here!
[invocation setArgument:&self atIndex:2];
[invocation setArgument:&filename atIndex:3];
[invocation setArgument:&contentType atIndex:4];
[invocation setArgument:&eTag atIndex:5];
установка аргумента в индекс 2 (&self
) вызывает следующую ошибку компилятора:
отправка * const _ _ strong * в параметр типа void * изменения сохраняют / освобождают свойства
Я понятия не имею, как это исправить, сохраняя при этом действующий код. В данный момент я просто торчу в NULL
и обертывание оператора invoke в блоке try/ catch, но это менее чем идеально решение.
Аналогичная проблема, если кто-то будет достаточно любезен, чтобы решить ее:
С этой строкой кода (из библиотеки MPOAuth)
status = SecItemCopyMatching((__bridge CFDictionaryRef)searchDictionary, (CFTypeRef *)&attributesDictionary);
Я получаю следующую ошибку
приведение косвенного указателя на Objective-C указатель на " CFTypeRef '(он же ' const void*') запрещено ARC
3 ответов
вы должны иметь возможность бросить его, чтобы получить соответствующий тип указателя:
NSInvocation* invocation = [NSInvocation invocationWithMethodSignature:signature];
[invocation setTarget:delegate];
[invocation setSelector:@selector(restClient:loadedFile:contentType:eTag:)];
Foo *foo = self;
[invocation setArgument:&foo atIndex:2];
[invocation setArgument:&filename atIndex:3];
[invocation setArgument:&contentType atIndex:4];
[invocation setArgument:&eTag atIndex:5];
эта строка:
status = SecItemCopyMatching((__bridge CFDictionaryRef)searchDictionary, (CFTypeRef *)&attributesDictionary);
можно решить следующим образом:
CFTypeRef outDictionaryRef;
status = SecItemCopyMatching((__bridge CFDictionaryRef)searchDictionary, &outDictionaryRef;
attributesDictionary = (__bridge_transfer NSDictionary *) outDictionaryRef;
поэтому, по сути, просто дайте ссылочный тип, который он ожидает как out param. И когда out param будет заполнен, передайте право собственности на ваш тип какао.
вместо того, чтобы менять SDK (Dropbox сказал, что скоро они опубликуют версию, совместимую с ARC), я обнаружил, что могу использовать ARC выборочно для файла. Так я и сделал.
и затем я обновился до 1.0b2, который упакован как библиотека, и поэтому проблема решена.