6

Tôi có một ứng dụng (chỉ ios5) bên trong một phương thức khai báo biến yếu được sử dụng bên trong khối để tham chiếu một thể hiện một bộ điều khiển xem.Cảnh báo tham chiếu biến cố định __weak mục tiêu-C không được chỉ định trên biến tự động "

QRCodeViewController * __weak weakSelf = self; 

Vấn đề là trình biên dịch cho thấy một cảnh báo nói:

__weak thuộc tính không thể được xác định trên cơ tự động biến

Trong ứng dụng mà tôi đã sử dụng rất nhiều tài liệu tham khảo yếu và tôi chưa bao giờ thấy một cảnh báo như vậy, sự khác biệt duy nhất từ ​​các lớp khác là lớp này được thực hiện trong một tệp .mm vì nó sử dụng đối tượng C++ và dự án không thể biên dịch nếu tôi để nó như là một .m.
Tôi phải nói rằng mã có vẻ hoạt động tốt.
Bất kỳ đề xuất nào?

+0

nên không nó được '__weak QRCodeViewController * weakSelf = tự;'? –

+2

@Martin hoặc là một tác phẩm, chúng tương đương nhau, cách của bạn là cách tôi thấy được sử dụng thường xuyên hơn, nhưng cách của Andrea là một trong những khuyến cáo của Apple. –

+0

Câu hỏi tương tự: http://stackoverflow.com/questions/10431110/nested-blocks-and-references-to-self. Trả lời rằng mục tiêu triển khai đã được đặt thành 4.0, nhưng đó không phải là trường hợp của bạn. Chính xác? –

Trả lời

4

Đối mặt với cảnh báo này cùng, tôi làm cho nó biến mất bằng một __block thuộc tính theo cách sau:

__block __weak MyViewController* weakSelf = self; 
+0

Vâng nó hoạt động !!!! – Andrea

0

Tôi không chắc chắn lý do cảnh báo cho biết rằng không thể chỉ định __weak. AFAIK nó có thể xác định nó, ngay cả khi nó rất nguy hiểm để sử dụng __weak cho các biến tự động.

Tài liệu của Apple cho biết trình biên dịch sẽ cung cấp cảnh báo nếu bạn làm, nhưng văn bản cảnh báo thực tế dường như ngụ ý rằng thuộc tính sẽ bị bỏ qua chứ không chỉ đơn thuần là sử dụng nó nguy hiểm, trong khi tài liệu dường như ngụ ý rằng nguy hiểm nhưng nó hoạt động như mong đợi (nếu bạn thực sự hiểu những gì mong đợi).

Bạn sẽ phải thực hiện một số thử nghiệm để xác minh xem văn bản cảnh báo không phù hợp hoặc nếu tài liệu chưa được cập nhật chính xác.

+0

Hi Analog File, cảm ơn câu trả lời của bạn, thực tế là điều bình thường là tạo ra các tham chiếu yếu cho các đối tượng mà bạn muốn chuyển tới một Block để tránh giữ lại các chu kỳ. Tôi đã tấn nhiều lần trong mã của tôi mà không có bất kỳ cảnh báo nào. Tôi đồng ý rằng yếu cho một biến tự động là nguy hiểm, hoặc tốt hơn là không có ý nghĩa, bởi vì khi bạn sẽ sử dụng trong một khối cho quá trình async biến biến mất vì nó không có một tham chiếu mạnh mẽ đến nó. Nhưng ở đây tôi chỉ định bản thân mà không phải là một biến tự động và được tham chiếu mạnh mẽ bởi sự tồn tại của chính lớp đó. – Andrea

+0

Nó không phải là vô nghĩa. Như bạn nói nó có trường hợp sử dụng hoàn toàn hợp lý. Nhưng nó nguy hiểm. Ví dụ khối không đồng bộ của bạn được phát hiện (rất nhiều người sẽ gặp sự cố khi hiểu tại sao nó không hoạt động). Đó là lý do đằng sau sự lựa chọn của Apple để làm cho nó hợp pháp và nhổ ra một cảnh báo.Nếu bạn xác minh rằng nó hoạt động, tôi đoán vấn đề là chủ yếu trong văn bản cảnh báo, không phải trong thực tế là bạn nhận được cảnh báo (đó là một quyết định có ý thức của các nhà phát triển trình biên dịch theo tài liệu). Đó cũng là lý do tại sao nó chỉ là một cảnh báo ngay cả khi nó được gọi là lỗi. –

+1

@AnalogFile: Bạn có tham chiếu đến tài liệu của Apple khi người ta nói rằng trình biên dịch phát ra cảnh báo nếu __weak được sử dụng với các biến tự động? Cảm ơn bạn! –

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