2012-09-28 10 views
12

thể trùng lặp:
Is literal creation of an NSMutableDictionary less efficient than the class helper method?Tạo một NSMutableArray với một chữ qua mutableCopy hoặc arrayWithArray:

Theo video WWDC giới thiệu literals ObjectiveC, NSMutableArray s có thể được khởi tạo như sau:

[NSMutableArray arrayWithArray:@[]]; 

nhưng nếu chúng ta làm như của anh ấy:

[@[] mutableCopy]; 

Tôi biết rằng người đó đang khởi tạo mảng và người kia chỉ cung cấp bản sao nông; do đó việc quản lý bộ nhớ là khác nhau. Nhưng nếu chúng ta đang sử dụng ARC, những nhược điểm của việc sử dụng sau này là gì? Nó có đắt hơn không? ARC có thể xử lý cả hai cách khác nhau, nhưng tôi chỉ tự hỏi nếu sử dụng mutableCopy là 'tồi tệ hơn' hay không.

+1

Điều gì về '[mảng NSMutableArray]'? –

Trả lời

5

Trong trường hợp trước, bạn kết thúc với hai đối tượng được thêm vào nhóm tự động phát hiện hiện tại: chữ NSArray và NSMutableArray mà bạn đang tạo từ nó. Sau này, NSArray theo nghĩa đen được thêm vào nhóm autorelease nhưng NSMutableArray được sao chép từ nó thì không. Vì vậy, trường hợp đầu tiên là hơi tồi tệ hơn, hiệu suất khôn ngoan, khi thoát khỏi nhóm tự động (ví dụ ở cuối chu trình chạy vòng lặp) yêu cầu phát hành cả hai đối tượng liên tiếp, trong trường hợp thứ hai, bản sao sẽ được giải phóng riêng từ chữ viết tự động. Trong thực tế, sự khác biệt thời gian sẽ cực kỳ nhỏ.

+0

thú vị! điều đó giải thích rất nhiều. cảm ơn. – KDaker

+5

Theo ARC, các autoreleases không cần thiết thường được tối ưu hóa, vì vậy thậm chí đó có thể không phải là mối quan tâm lớn. –

+0

Đó không nhất thiết phải là trường hợp. Lần cuối cùng tôi thử nghiệm, Foundation dường như không được biên dịch với ARC. Điều này quan trọng, vì khi biên dịch với ARC, clang không chèn 'return [retVal autorelease];' - nó thực sự chèn 'return objc_autoreleaseReturnValue (retVal);'. Tương tự như vậy, người gọi (mã của bạn) không gọi '-retain' trên kết quả, nó gọi' objc_retainAutoreleasedReturnValue'. Sự kết hợp của hai hàm này xung quanh phương thức đó trả về kết quả trong đối tượng không bao giờ thực sự nhập vào nhóm autorelease. Nếu không, nó vẫn kết thúc ở đó. –