Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

like image 784
FeifanZ Avatar asked Sep 25 '11 23:09

FeifanZ


2 Answers

You should be able to cast it to get an appropriate pointer type:

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];
like image 84
Christopher Pickslay Avatar answered Nov 01 '22 13:11

Christopher Pickslay


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.

like image 2
Toad Avatar answered Nov 01 '22 11:11

Toad