2011-09-25 40 views
9

Trong một môi trường ARC, tôi có đoạn mã sau:Loại chuyển & tự gây ra trình biên dịch lỗi

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

Thiết lập luận để chỉ số 2 (&self) gây ra lỗi biên dịch sau:

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

Tôi không có ý tưởng làm thế nào để sửa lỗi này trong khi vẫn giữ mã hợp lệ. Tại thời điểm này tôi chỉ gắn bó trong NULL và gói câu lệnh gọi trong một khối try/catch, nhưng đó là một giải pháp ít hơn lý tưởng.


Một vấn đề tương tự, nếu có ai sẽ được loại, đủ để giải quyết nó là tốt:

Với dòng mã này (từ thư viện MPOAuth)

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

tôi nhận được lỗi sau

Cast of an indirect pointer to an Objective-C pointer to 'CFTypeRef ' (aka 'const void *') is disallowed with ARC

+1

Có một số lý do cụ thể khiến bạn muốn sử dụng NSInvocation thay vì một khối ở đây không? – NSResponder

+0

Tôi không chắc chắn, đó là một phần của SDK Dropbox. Tôi chỉ cần làm cho nó tuân thủ ARC, cố gắng không làm hỏng mã quá nhiều. – FeifanZ

Trả lời

0

Thay vì thay đổi SDK (Dropbox đã nói rằng họ sẽ đăng phiên bản tương thích ARC sớm), tôi phát hiện ra rằng tôi có thể sử dụng ARC có chọn lọc cho một tệp. Vì vậy, tôi đã làm điều đó.

Và sau đó tôi nâng cấp lên 1.0b2, được đóng gói dưới dạng thư viện và do đó vấn đề được giải quyết.

13

Bạn có thể truyền nó để có được loại con trỏ thích hợp:

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

dòng này:

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

có thể được giải quyết như sau:

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

Vì vậy, trong bản chất chỉ cung cấp cho các loại tài liệu tham khảo dự kiến ​​là param ra. Và khi tham số ngoài được điền, hãy chuyển quyền sở hữu sang loại cacao của bạn.

Các vấn đề liên quan