2010-11-02 31 views
5

Khi tôi cần một mảng để sử dụng tạm thời, sự khác biệt giữa những gì:autorelease vs phát hành

1:

NSMutableArray *stuff = [[NSMutableArray alloc] init]; 
// use the array 
[stuff release]; 

2:

NSMutableArray *stuff = [NSMutableArray array]; 
// use the array 

3:

NSMutableArray *stuff = [[[NSMutableArray alloc] init] autorelease]; 
// use the array 

Tôi thích số 2, vì nó ngắn hơn. Có lý do nào tốt để sử dụng số 1 hoặc 3 không?

Trả lời

10

Số 2 có thể là lựa chọn tốt nhất trong hầu hết các trường hợp.

Số 1 có khả năng mất bản phát hành tại một số điểm, vì bất kỳ lý do gì, nhưng nó giải phóng mảng ngay lập tức, trong môi trường có bộ nhớ bị bỏ đói có thể hữu ích.

Số 3 về cơ bản là tương đương với số 2, nhưng nó có ích nếu bạn muốn sử dụng initWith * không có mảng tương ứngWith *.

Lưu ý: Nếu bạn bộ nhớ đói, chẳng hạn như trong một vòng lặp đắt nơi bạn cần một mảng tươi cho mỗi lần lặp; không phát hành và phân bổ mảng mới; chỉ cần sử dụng -removeAllObjects và tái chế mảng.

+0

Cảm ơn! Điểm tốt về việc phát hành ngay lập tức của bộ nhớ trong số 1. – keronsen

+2

Trên iPhone, bạn sẽ thấy hầu hết mọi người sử dụng số 1 vì bộ nhớ được trả lại cho thời gian chạy sớm hơn. Trong thực tế, Apple khuyên bạn nên tránh autorelease càng nhiều càng tốt (trên iPhone). – JeremyP

+1

Câu trả lời hay, tiết kiệm cho bit cuối cùng. Tôi muốn đặt cược rằng sự khác biệt giữa việc tạo ra một mảng mới trên mỗi lần vượt qua và loại bỏ tất cả các đối tượng là vô lượng và, rất có thể, loại bỏ tất cả các đối tượng sẽ chậm hơn một cách chậm chạp. Trong mọi trường hợp, không tối ưu hóa cho đến khi bạn có một vấn đề hiệu suất định lượng. – bbum

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