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