类型转换& self会导致编译器错误

时间:2011-09-25 23:03:22

标签: objective-c ios xcode4 automatic-ref-counting

在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 / catch块中,但这不是一个理想的解决方案。

<小时/> 类似的问题,如果有人也愿意解决它:

使用这行代码(来自MPOAuth库)

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

我收到以下错误

  

ARC禁止使用指向'CFTypeRef '(又名'const void * ')的Objective-C指针的间接指针

3 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:2)

这一行:

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

可以解决如下:

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

所以实质上只是给出它所期望的引用类型作为out参数。当填写out参数时,将所有权转移到你的可可类型。

答案 2 :(得分:0)

我没有更改SDK(Dropbox已经表示他们将很快发布与ARC兼容的版本),而是发现我可以有选择地使用ARC作为文件。所以我做到了。

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