Để rõ ràng, tôi muốn tạo một vòng lặp ban đầu nơi tôi thu thập các mục cần xóa. Sau đó tôi xóa chúng. Đây là một mẫu sử dụng cú pháp Objective-C 2.0:
NSMutableArray *discardedItems = [NSMutableArray array];
for (SomeObjectClass *item in originalArrayOfItems) {
if ([item shouldBeDiscarded])
[discardedItems addObject:item];
}
[originalArrayOfItems removeObjectsInArray:discardedItems];
Sau đó, không có câu hỏi về việc liệu các chỉ số đang được cập nhật chính xác, hoặc các chi tiết kế toán nhỏ khác.
Chỉnh sửa để thêm:
Nó đã được lưu ý trong các câu trả lời khác rằng công thức nghịch đảo nên nhanh hơn. tức là Nếu bạn lặp qua mảng và soạn một mảng mới của các đối tượng cần giữ, thay vì các đối tượng để loại bỏ. Điều đó có thể đúng (mặc dù về bộ nhớ và chi phí xử lý để phân bổ một mảng mới và loại bỏ mảng cũ thì sao?) Nhưng ngay cả khi nó nhanh hơn thì nó cũng không phải là vấn đề lớn đối với việc triển khai ngây thơ, bởi vì NSArrays không hành xử như mảng "bình thường". Họ nói chuyện nhưng họ đi bộ khác nhau. Xem một phân tích tốt ở đây:
Công thức nghịch đảo có thể nhanh hơn, nhưng tôi không bao giờ cần quan tâm đến việc đó, bởi vì công thức trên luôn đủ nhanh cho nhu cầu của tôi.
Đối với tôi, thông điệp mang về nhà là sử dụng bất kỳ công thức nào là rõ ràng nhất đối với bạn. Tối ưu hóa chỉ khi cần thiết. Cá nhân tôi thấy công thức trên rõ ràng nhất, đó là lý do tại sao tôi sử dụng nó. Nhưng nếu công thức nghịch đảo rõ ràng hơn với bạn, hãy tìm nó.