2012-03-17 23 views
28

Tôi vừa chuyển đổi một dự án cũ sang ARC bằng cách sử dụng tái cấu trúc tự động của Xcode.Sau khi chuyển đổi tự động ARC: Gán đối tượng được giữ lại cho thuộc tính không an toàn; đối tượng sẽ được phát hành sau khi gán

@property (nonatomic, retain) NSMutableArray *cards; 

đã được thay thế bởi:

@property (nonatomic) NSMutableArray *cards; 

này có ý nghĩa bởi vì những gì tôi đã đọc là "mạnh" là trạng thái mặc định. Tuy nhiên, dòng sau là cho tôi những lỗi trong tiêu đề:

self.cards = [[NSMutableArray alloc] initWithCapacity:54]; 

Các lỗi được giải quyết bằng cách thêm strong trở lại trong nơi giữ lại từng là:

@property (nonatomic, strong) NSMutableArray *cards; 

Tuy nhiên ... nếu tôi cần để quay lại và đặt strong vào mỗi khai báo @property là retain ... tại sao việc cấu trúc lại ARC loại bỏ tất cả?

+0

Thực ra, ngữ nghĩa quản lý bộ nhớ mặc định là 'assign', chứ không phải' strong', đó là lý do tại sao bạn nhận được thông báo cảnh báo. – jlehr

+5

jlehr không đúng về ngữ nghĩa quản lý bộ nhớ mặc định. nhưng anh ta cũng không sai. trước LLVM 3.1 & ARC mặc định thực sự đã được gán. nhưng ngày nay nó mạnh mẽ. điều này không may là rất kém tài liệu. xem câu trả lời của nschum. – stigi

+1

Bây giờ mặc định là mạnh, cảnh báo sẽ biến mất. Tại sao nó không? –

Trả lời

42

Tôi đã gặp phải cảnh báo tương tự và đã mở Sự cố hỗ trợ kỹ thuật. Kỹ sư đã xác minh rằng mặc định đã được thay đổi từ "gán" thành "mạnh" vì lý do nhất quán trong ARC.

Ông cho biết cả cảnh báo và tài liệu đều sai và sẽ được khắc phục. Cho đến khi được thực hiện, tôi sẽ tránh hoàn toàn mặc định hoàn toàn!

Thêm rõ ràng "mạnh" (như BJ Homer được đề xuất) là cách an toàn để tắt tiếng cảnh báo và tương thích. Nhưng đừng cho rằng các thuộc tính không được mặc định. Luôn đặt "yếu" hoặc "chỉ định" ở đó.

Chỉnh sửa: clang documentation hiện chính thức ghi lại thay đổi này. Cảnh báo đã là fixed.

Chỉnh sửa 2: Xcode 4.4 dường như bao gồm bản sửa lỗi.

+0

Vì vậy, cảnh báo đã được sửa. Khi nào chúng ta sẽ thấy bản sửa lỗi này trong xcode? –

+1

@nschum cảnh báo này vẫn xảy ra trong phiên bản mới nhất của Xcode 4.3.3. tại sao? –

+0

Thật không may, cam kết được liên kết là đến * trunk * LLVM. Vì vậy, tôi sẽ không nhất thiết mong đợi bản sửa lỗi hiển thị trong bản phát hành bảo trì. Tôi chưa thử Xcode 4.4. – nschum

8

Có vẻ như nó đã chuyển đổi nonatomic, retain thành nonatomic. Tôi đã luôn thấy nó chuyển đổi thành nonatomic, strong. Nếu bạn có thể sản xuất một dự án đơn giản chuyển đổi theo cách bạn nhìn thấy nó thì tôi đề nghị filing a radar với nó.

Tôi giả sử theo cách bạn đang sử dụng Xcode mới nhất.

+0

Tôi đang sử dụng 4.3.1 mà tôi đã tải xuống từ App Store ngày hôm qua, vì vậy nó tốt hơn là mới nhất. :) –

+2

Vâng, thật không may, một lỗi đã biết trong 4.3.1. Tôi tự báo cáo ngày hôm trước. Cách giải quyết đơn giản nhất là chỉ cần thực hiện một dự án regex thay thế 'retain (, | \))' bằng 'strong \ 1'. Sau đó chạy lại chuyển đổi ARC. –

+1

Chắc chắn gửi một radar sau đó @KennyWyland – mattjgalloway

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