2011-10-18 28 views
28

Khi cập nhật một số mã của tôi tương thích với SDK iOS 5, tôi đã cố gắng cấu trúc lại mã của mình bằng cách sử dụng "Chuyển đổi thành mục tiêu- C ARC "trong Xcode và đã nhận được lỗi. Lỗi xảy ra trên một biến cá thể trong tệp .h của tôi.Đếm tham chiếu tự động: Con trỏ tới loại không phải là 'NSError *' không có quyền sở hữu rõ ràng

NSError **_error; 

Lỗi nói "Con trỏ đến loại không phải là" NSError * 'không có quyền sở hữu rõ ràng ". Làm thế nào tôi có thể sửa lỗi này?

+0

Câu hỏi này (xem http://stackoverflow.com/questions/6907726/setting-nserror-within-a-block-using-arc) là điều gần nhất tôi có thể tìm thấy về chủ đề này. – Ziminji

+1

Tại sao bạn sử dụng hai hướng trong một biến mẫu? Bạn chỉ cần điều đó cho các tham số phương thức sao cho NSErrors có thể được truyền lại. –

+0

@BradLarson ok, vậy cách nào đúng (trong ARC) để khởi tạo một cá thể 'NSError' khi gọi một phương thức nhận' (NSError **): error' làm đối số? – raffian

Trả lời

18

Khi lưu trữ NSError các đối tượng trong một biến Ví dụ bạn phải khai báo nó như một con trỏ đơn giản:

@interface Foo : NSObject 
{ 
    NSError *_errror; 
} 

NSError ** chỉ được sử dụng để gián tiếp trở NSError đối tượng từ một phương pháp để người gọi. Đó là (có thể) một lỗi để lưu trữ nó trong một biến cá thể.

54

Bạn có thể sử dụng một trong những vòng đời được mô tả trong Transitioning to ARC Release Notes

Đối NSError ** bạn muốn sử dụng __autoreleasing để ví dụ được cung cấp bởi Nikolai sau đó sẽ trông như thế này

@interface Foo : NSObject 
{ 
    NSError * __autoreleasing *error; 
} 

Cú pháp là một chút lạ và bạn nên làm theo lời khuyên của Nikolais, nhưng nếu bạn chắc chắn NSError ** là những gì bạn muốn điều này sẽ làm việc.

+1

Điều này không biên dịch, hãy thử 'NSError * __autoreleasing * _error;' –

+2

Đây là câu trả lời đúng. Nó không phải là sai để làm điều này như là câu trả lời của @NikolaiRuhe tiểu bang. –

+3

Cảm ơn câu trả lời này! Tôi muốn thêm rằng tôi cũng đã sử dụng vòng loại vòng đời khác với cùng cú pháp này, như 'NSArray * __strong * mảng', v.v. –

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