&自我类型转换导致编译器错误

在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并将try语句包装在try / catch块中,但这是一个不太理想的解决方案。


一个类似的问题,如果任何人都会友好地解决它:

用这行代码(来自MPOAuth库)

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

我收到以下错误

对指向'CFTypeRef'的Objective-C指针(又名'const void *')的间接指针的转换不允许使用ARC


您应该能够将其转换为适当的指针类型:

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参数。 当外部参数填写完毕后,将所有权转移到您的可可类型。


不是改变SDK(Dropbox已经表示他们很快会发布一个兼容ARC的版本),我发现我可以选择性地使用ARC作为文件。 所以我做到了。

然后我升级到1.0b2,它被打包成一个库,所以问题就解决了。

链接地址: http://www.djcxy.com/p/44903.html

上一篇: Type conversion of &self causes compiler error

下一篇: C SCNetworkReachabilityContext ARC conversion