Type conversion of &self causes compiler error

In an ARC environment, I have the following code:

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

Setting the argument to index 2 ( &self ) causes the following compiler error:

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

I have no idea how to fix this while keeping valid code. At the moment I'm just sticking in NULL and wrapping the invoke statement in a try/catch block, but that's a less-than-ideal solution.


A similar issue, if anyone would be kind enough to address it as well:

With this line of code (from the MPOAuth library)

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

I get the following error

Cast of an indirect pointer to an Objective-C pointer to 'CFTypeRef ' (aka 'const void *') is disallowed with 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];

this line:

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

can be resolved as following:

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

So in essence just give the reference type it expects as the out param. And when the out param is filled out, transfer the ownership to your cocoa type.


Rather than changing the SDK (Dropbox has said that they'll be posting an ARC-compatible version soon), I found out that I can use ARC selectively for a file. So I did that.

And then I upgraded to the 1.0b2, which is packaged as a library and so the issue is solved.

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

上一篇: 指针铸造与ARC

下一篇: &自我类型转换导致编译器错误