Преобразование типа и вызывает ошибку компилятора

в среде 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, который упакован как библиотека, и поэтому проблема решена.