Nó không phải là câu hỏi để sử dụng hoặc không sử dụng tự động phát hành, bởi vì trong một số trường hợp autorelease là cách duy nhất bạn sẽ vượt qua. Câu hỏi phải là "Tại sao không sử dụng tự động phát trên tất cả các đối tượng, thay vì sử dụng giữ lại và giải phóng?".
Để trả lời điều đó, trước hết bạn nên tìm hiểu cách sử dụng thích hợp cho tự động phát hành. Giả sử bạn có một lớp có hai thuộc tính: firstName và lastName. Có một getter và một setter cho mỗi. Nhưng bạn cũng cần một phương thức có thể trả về fullName, bằng cách ghép hai chuỗi này thành một chuỗi hoàn toàn mới:
- (NSString *) fullName {
NSString str = [[NSString alloc]initWithFormat:@"%@ %@", firstName, lastName];
// this is not good until we put [str autorelease];
return str;
}
Có gì sai với ảnh đó? Số lượng tham chiếu trên chuỗi được trả về là 1, vì vậy nếu bạn không muốn bị rò rỉ, người gọi sẽ phát hành nó khi hoàn thành.Từ quan điểm của người gọi, anh ta chỉ yêu cầu một giá trị tài sản fullName
. Anh không biết thực tế là anh có một vật thể hoàn toàn mới mà anh nên phát hành sau khi sử dụng, và không phải là một số tham chiếu đến một NSString trong nội bộ được tổ chức bởi lớp học!
Nếu chúng tôi đặt [str release]
trước khi trở về, chuỗi sẽ bị hủy và phương thức sẽ trả về rác! Đó là nơi chúng tôi sử dụng [str autorelease]
, để đánh dấu đối tượng để phát hành sau này (thường là khi xử lý sự kiện được thực hiện). Bằng cách đó người gọi nhận được đồ vật của mình, và không phải lo lắng liệu anh ta có nên thả nó hay không.
Quy ước là gọi tự động phát lại trên đối tượng mới trước khi phương thức trả lại cho người gọi. Ngoại lệ là các phương thức có tên bắt đầu bằng alloc
, new
hoặc copy
. Trong những trường hợp như vậy, người gọi biết rằng một đối tượng hoàn toàn mới được tạo ra cho họ và đó là nhiệm vụ của họ để gọi phát hành trên đối tượng đó.
Thay thế phát hành với tự động hoàn toàn là một ý tưởng tồi, vì các đối tượng sẽ chồng chất và làm tắc nghẽn bộ nhớ rất nhanh, đặc biệt là trong các vòng lặp. Các tài nguyên trên iPhone bị hạn chế, do đó, để giảm thiểu việc hoán đổi bộ nhớ, đó là nhiệm vụ của bạn để giải phóng đối tượng ngay khi bạn hoàn thành nó.
vui lòng giúp đỡ (đã cho tôi điều gì đó để tìm kiếm :-) – TofuBeer
Những gì họ không đề cập đến là rất nhiều lớp trong Tự động gọi là Foundation trên các đối tượng mà họ quản lý và do đó trong các vòng chặt chẽ bạn cần tạo và quản lý các nhóm tự động phát hành riêng nếu bạn đang xử lý ngay cả một lượng dữ liệu khiêm tốn. – rpetrich
Tôi không nghĩ rằng đó là chi phí trong việc duy trì hồ bơi; thay vào đó, tốt nhất là không nên cấp phát bộ nhớ nhưng không được sử dụng lâu hơn mức cần thiết trong môi trường hạn chế bộ nhớ. Tự động trả lại bộ nhớ được cấp phát dài hơn mức cần thiết. – Paul