2016-03-09 13 views
8

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

example

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?

+0

Đ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. –

+2

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 ". –

Trả lời

5

Bài viết sai.

Sự hiểu biết của bạn về cơ bản là chính xác, mặc dù trường hợp này không sử dụng nhóm tự động phát hành. Biểu thức con:

[[NSString alloc] initWithFormat:@"Name 1"]]; 

trả về một đối tượng sở hữu, giống như tất cả phương thức init. Đối tượng đó được chuyển đến addObject: và mảng cũng có quyền sở hữu. Sau đó ARC thấy chuỗi không còn được yêu cầu bởi phương thức và từ bỏ quyền sở hữu của nó - để lại mảng làm chủ sở hữu duy nhất.

HTH

+0

ah tôi thấy, vì vậy nếu nó không phải là một tham số, nó chỉ từ bỏ quyền sở hữu của nó ngay lập tức sau khi được tuyên bố, nhưng tại thời điểm đó là nó dealloced, hoặc nó nhận được vào cuối của autorelease hồ bơi trước khi được dealloced?(im giả sử cái cũ vì bạn đã đề cập đến bể tự động không được sử dụng, nhưng có vẻ hơi mơ hồ trong trường hợp bạn đang nói đến, chỉ muốn làm rõ) – Fonix

+0

Bể tự động phát hành không được sử dụng trong trường hợp này vì nó không được tự động phát hành vật. – rmaddy

+0

đã nhận được, cảm ơn! – Fonix

4

ARC không có lỗi ở đây. Có vẻ như bài viết sai.

ARC sẽ giải phóng đối tượng tham số được phân bổ như mong đợi trong khi mảng giữ tham chiếu của nó. Khi mảng được giải phóng, đối tượng sẽ không có thêm tham chiếu và nó cũng sẽ được deallocated, như mong đợi.

+0

nếu chúng ta có thể có thêm vài người đồng ý với chúng tôi, thì có thể bị bệnh trong phần bình luận bài viết để cảnh báo họ hoặc bất cứ ai khác tìm thấy bài viết – Fonix

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