So I’m trying to convert an old project to Automatic Reference Counting. I’m trying to use the conversion tool that xCode has but it says to fix a couple things before it can convert. I have no idea how to fix this error. It’s in the implementation of the keychain file. This method is the one that returns the error, specifically the line with the SecItemCopyMatching. The error I am getting says: ” Cast of an indirect pointer to an Objective-C pointer to ‘CFTypeRef*’ (aka ‘const void**’) is disallowed with ARC. I’ve been looking all over google, apple docs, and a bunch of other crap and can’t find a better way to fetch an existing data dictionary in the keychain. Any help appreciated. Thanks!
-(NSMutableDictionary*)fetchDictionary {
NSMutableDictionary *genericPasswordQuery = [self buildSearchQuery];
NSMutableDictionary *outDictionary = nil;
OSStatus status = SecItemCopyMatching((__bridge_retained CFDictionaryRef)genericPasswordQuery, (CFTypeRef*)&outDictionary);
if (DEBUG) printf("FETCH: %s\n", [[self fetchStatus:status] UTF8String]);
if (status == errSecItemNotFound) return NULL;
return outDictionary;
}
You don’t need to disable ARC for this; you just need to declare the query’s result as a
CFDictionaryRef, then cast it to anNSDictionaryafter the call.Couple of remarks:
__bridge_retainedto make sure ARC does not release and deallocate the object while we are working with it. This kind of bridging cast retains the object, so to prevent leaks, it must be followed with a correspondingCFReleasesomewhere.SecItemCopyMatchingdefinitely will not release the query for us, so if we use a retained bridge, then we need to release the resulting Core Foundation object ourself. (Which we do in line 4.)SecItemCopyMatchinghas created its result with a retain count of 1, which we are responsible for releasing. (We know this because it has “Copy” in its name.)__bridge_transferlets ARC know about this responsibility, so it will be able to do it for us automatically.NSMutableDictionary; that’s just wrong. Also, it is against general Cocoa style conventions thatbuildSearchQueryreturns anNSMutableDictionary. SimpleNSDictionarys would work fine in both cases.The rule of thumb here is that
__bridge_retainedneeds to be followed by aCFRelease, while the result from a “Copy” or “Create” function must be cast into Cocoa-land using__bridge_transfer.