Kiến thức ARC của tôi đã được kiểm tra ngày hôm nay không, tôi tình cờ gặp this article và nó có một ví dụ dưới tiêu đề "Làm tổ báo cáo".ARC có giữ lại các đối tượng được phân bổ bên trong tham số phương thức
Trong ví dụ họ cho thấy nhúng trên, dòng đánh dấu bằng một gạch dưới màu xanh lá cây nói rằng chuỗi alloced bên trong hàm đầu tiên sẽ nhận được một giữ lại đếm 1 khi được tạo ra, sau đó +1 lần nữa khi thêm với mảng, sau đó một khi mảng được đặt sau vòng lặp, số lượng giữ lại của chuỗi sẽ bị giảm đi 1, để lại chuỗi gốc với số lượng giữ lại là 1, do đó không bị dealloced.
tôi sẽ giả định trình biên dịch sẽ được thông minh đủ để ít nhất làm cho một đối tượng như vậy không thực sự có một số giữ lại ban đầu, vì nếu bạn chỉ có
[[NSString alloc] initWithFormat:@"Name 1"]];
chuỗi này được alloced sẽ không có gì chỉ vào nó và sẽ được phát hành khi nhóm autorelease kết thúc thay vì có số lần giữ lại là 1 mãi mãi. vậy tại sao nó lại có hành vi khác nhau khi nó trong một tham số của một hàm? (trừ khi dòng đó có một số giữ lại 1 và điều này bằng cách nào đó là một rò rỉ bộ nhớ? nếu không nó có thể có một số giữ lại 1 cho đến khi kết thúc phạm vi của nó chắc chắn nhất, nhưng sau đó logic sẽ áp dụng nếu một tham số của nó là tốt tôi sẽ giả định)
Bài viết này sai hoặc là sự hiểu biết của tôi về ARC thiếu sót?
Điều này sai. Và tại sao họ tiếp tục hiển thị 'alloc init', trong khi chúng ta có các phương thức tiện lợi để sử dụng trong phạm vi phương thức ... Weird. –
Bài viết sai (như được chỉ ra bên dưới). Bạn sẽ tìm thấy các chi tiết đẫm máu trong http://clang.llvm.org/docs/AutomaticReferenceCounting.html#retained-return-values: * "Khi nhận được kết quả trả về từ một hàm hoặc phương thức như vậy, ARC sẽ giải phóng giá trị tại cuối của biểu thức đầy đủ nó được chứa bên trong, tùy thuộc vào việc tối ưu hóa thông thường cho các giá trị cục bộ. "* - Cả hai' name = nil' và 'array = nil' không cần thiết để" giúp bộ nhớ phát hành ARC ". –