5

Tôi có một hàm trả về một đối tượng NSError bằng cách tham khảo:Đúc một NSError trở lại một CFErrorRef trở

NSData *foo(NSData *foo, NSError *__autoreleasing *outError); 

Chức năng này sử dụng một API mà phải mất một con trỏ đến lưu trữ cho một CFErrorRef. Tôi chỉ muốn chuyển trực tiếp outError cho hàm cơ bản, nhưng tôi không thể tìm ra sự kết hợp chính xác của các từ khóa khai báo và các từ khóa được tạo để làm cho clang đồng ý với kế hoạch đó. Có cái nào không?

+0

cheat? lỗi blah ((CFErrorRef *) (void *)); –

+0

... nếu không, đó chỉ là quy trình gồm hai bước. Tôi nghĩ rằng trình biên dịch khá rõ ràng rằng nó cần bạn thực hiện một tuyên bố địa phương. Tôi nghĩ rằng nó không thể làm sổ sách kế toán của nó đúng cách, nếu không. (Lỗi CFErrorRef2; blah (& error2); * error = (__bridge NSError *) error2; - Tôi đoán đó là những gì bạn đang cố tránh). –

+0

Thật vậy, tôi không muốn phải làm nóng đối tượng lỗi đối với người gọi. –

Trả lời

3

Nếu bạn nhìn vào số clang notes for __autoreleasing, nó đề cập đến phép thuật xảy ra tại thời điểm gán, điều đó có nghĩa là tính năng truyền tự động không thể trợ giúp ở đây. Bạn cần thực sự thực hiện nhiệm vụ bằng cách sử dụng biến tạm thời như được đề cập trong các nhận xét trên bài đăng gốc.

0

Hãy thử điều này:

NSError + CFErrorRef.h

@interface NSError (CFErrorRef) 

- (CFErrorRef) cferror; 

@end 

NSError + CFErrorRef.m

#import "NSError+CFErrorRef.h" 

@implementation NSError (CFErrorRef) 

- (CFErrorRef) cferror 
{ 
    CFStringRef domain = (CFStringRef) self.domain; 

    CFDictionaryRef userInfo = (__bridge CFDictionaryRef) self.userInfo; 

    return CFErrorCreate(kCFAllocatorDefault, domain, self.code, userInfo); 
} 

@end 

Tôi đã viết một bài kiểm tra ít đơn vị nhanh chóng để xác minh tất cả mọi thứ chuyển đổi và dường như hoạt động chính xác. Sau đó, bạn chỉ có thể thực hiện công cụ chọn sau trên đối tượng NSError của mình

CFErrorRef e = [error cferror]; 
+1

Không cần tạo đối tượng CFError từ đối tượng NSError, vì hai lý do: (1) Hàm tôi gọi trả về một đối tượng CFError. (2) CFError và NSError là cầu nối miễn phí, do đó đối tượng CFError là một đối tượng NSError. Những gì tôi đang tìm kiếm là một cách để thuyết phục trình biên dịch cho phép tôi vượt qua con trỏ ra khỏi NSError của tôi tới đối số con trỏ ra ngoài của hàm CFError mà không cho tôi một lỗi hoặc làm rò rỉ nó. –

+0

Ồ tôi hiểu rồi, tôi đã đi đúng đường tiêu đề. Đó là một chút khó khăn hơn để chứng minh trong sự cô lập hehehe – jerrylroberts

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