2011-09-25 11 views
9

neden olur Aşağıdaki kod var:Tip dönüşümü bir ARC ortamında derleyici hatası

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]; 

indeksi 2 (&self) için bağımsız değişken ayarı aşağıdaki derleyici hata neden olur:

Sending *const __strong * to parameter of type void * changes retain/release properties

Geçerli kodu tutarken bunu nasıl düzeltebilirim bilmiyorum. Şu anda sadece NULL'a yapışıyor ve bir try/catch bloğunda invoke ifadesini sarmalamaktayım, ama bu ideal bir çözüm değil.


Benzer bir mesele, herkes de bunu ele almak nezaketini olurdu: (MPOAuth kütüphanesinden) Bu kod satırı

status = SecItemCopyMatching((__bridge CFDictionaryRef)searchDictionary, (CFTypeRef *)&attributesDictionary); 

aşağıdaki hatayı alıyorum ile

Cast of an indirect pointer to an Objective-C pointer to 'CFTypeRef ' (aka 'const void *') is disallowed with ARC

+1

Burada bir blok yerine NSInvocation kullanmak istediğiniz belirli bir neden var mı? – NSResponder

+0

Emin değilim, bu Dropbox SDK'sının bir parçası. Ben sadece ARC-uyumlu hale getirerek, kodu çok fazla karıştırmamaya çalışıyorum. – FeifanZ

cevap

0

SDK'yı değiştirmek yerine (Dropbox yakında ARC uyumlu bir sürüm yayınlayacaklarını söyledi), bir dosya için ARC'yi seçici olarak kullanabileceğimi öğrendim. Ben de öyle yaptım.

Ve sonra bir kitaplık olarak paketlenmiş olan 1.0b2'ye yükselttim ve sorun çözüldü.

13

Uygun bir işaretçi türü almak için onu atayabilmeniz gerekir:

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]; 
2

bu satırı:

status = SecItemCopyMatching((__bridge CFDictionaryRef)searchDictionary, (CFTypeRef *)&attributesDictionary); 

şöyle çözülebilir: özünde

CFTypeRef outDictionaryRef; 
status = SecItemCopyMatching((__bridge CFDictionaryRef)searchDictionary, &outDictionaryRef; 
attributesDictionary = (__bridge_transfer NSDictionary *) outDictionaryRef; 

Dolayısıyla, sadece dışarı param olarak beklediği referans tipini verir. Ve çıkış paragrafı doldurulduğunda, mülkiyeti kakao tipinize aktarın.