2009-05-20 36 views

Trả lời

55

Bạn có thể gọi trực tiếp bản phát hành trên NSArray. Việc triển khai NSArray sẽ xử lý việc gửi release tới tất cả các đối tượng được lưu trữ trong mảng.

+1

Nên thêm: nếu bạn có số lần lưu giữ trên một trong các đối tượng có sẵn, thì bạn nên tự động trả lại * trước khi * bạn thêm nó vào mảng. –

+1

Tôi đang bối rối. Tại sao tôi phải autorelease * trước khi * thêm nó vào một mảng? Ví dụ, tôi không thể làm một 'phát hành' sau khi thêm nó vào mảng? ví dụ: [arrayObject addObject: myObject]; [bản phát hành myObject]; –

+0

@ Heng-Cheong Leong có, đó cũng là chấp nhận được. Vấn đề là không mạo hiểm đối tượng của bạn bị dealloc'd trước khi nó được giữ lại bởi mảng đó. –

1

Bạn sẽ có thể chỉ phát hành NSArray, và nó sẽ phát hành tất cả các đối tượng của nó, bất kể bạn đang giữ các tham chiếu khác cho họ. Nếu bạn có một đối tượng cá thể cũng tồn tại trong NSArray, bạn sẽ phải giải phóng đối tượng đó một cách rõ ràng - chỉ việc giải phóng NSArray có thể không giải quyết đối tượng bên ngoài ngữ cảnh mảng.

+0

dealloc'ing một NSArray sẽ * luôn luôn * giải phóng tất cả các đối tượng của nó, bất kể các tham chiếu khác (có thể hoặc không thể khiến chúng được dealloc'd ngay lập tức tùy thuộc vào các tham chiếu khác); bạn đang conflating "phát hành" và "dealloc". – smorgan

+0

Cảm ơn - đã chỉnh sửa để sửa. – Tim

10

NSArray giữ lại các đối tượng khi chúng được thêm vào và giải phóng chúng khi chúng bị xóa hoặc mảng được deallocated. Hãy ghi nhớ điều này, đó là khái niệm "quyền sở hữu" giữ lại/giải phóng quản lý bộ nhớ được xây dựng dựa trên đó. Nó giống với đối tượng sở hữu mảng, nếu nó cũng giữ lại các đối tượng trong mảng, bạn sẽ cần phải gửi cho họ một thông báo phát hành khác trong bản thực hiện dealloc của bạn. Nếu không, và nếu không có các đối tượng khác giữ lại chúng, chúng sẽ được deallocated khi mảng phát hành chúng.

+0

Cảm ơn, câu đầu tiên của bạn đã cứu được ngày của tôi! –

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