Tương đương với @autoreleasepool trong Swift là gì?


76

Trong Swift, tôi nhận thấy không có @autoreleasepool{}cấu trúc nào , mặc dù Swift sử dụng ARC. Cách thích hợp để quản lý một bộ đệm tự động trong Swift là gì, hoặc nó đã bị xóa vì một lý do nào đó?


có lẽ nó chỉ là không được tiết lộ cho chúng tôi chưa (và thực hiện một tùy chỉnh với cầu ObjC được dễ dàng)
Bryan Chen

Cũng liên quan và quan tâm: "Có cần thiết phải sử dụng autoreleasepool trong chương trình Swift không?" stackoverflow.com/questions/25860942/…
Valentin Shergin

Câu trả lời:


118

Điều này được giải thích chi tiết trong video phiên WWDC 2014 số 418 "Cải thiện ứng dụng của bạn với các thiết bị", bạn cũng có thể tải xuống dưới dạng PDF.

Nhưng tóm lại, cú pháp là:

autoreleasepool {
  /* code */ 
}

7
Điều quan trọng cần lưu ý là { phải trên cùng một dòng với autoreleasepool, nếu không bạn phải quấn nó vào ( ). Thành thật mà nói thì điều đó thực sự khiến tôi khó chịu ...
Erik

1
@SiLo thật à? Tệ thật. Bạn nên gửi một báo cáo lỗi.
Abhi Beckert

19
@AbhiBeckert @SiLo Nó không phải là một lỗi. autoreleaselà một hàm nhận bao đóng làm đối số. Đây là một ví dụ về cú pháp ngắn gọn của đối số đóng-làm-cuối-cùng.
Cezary Wojcik

1
@CezaryWojcik Đúng, nhưng tại sao nó lại quan trọng nếu tôi đặt {dòng mới thay vì ngay sau đó?
Erik

6
@SiLo Vì không có dấu chấm phẩy, nếu bao đóng ở dòng tiếp theo, thì không có đảm bảo cú pháp rằng bao đóng đó được coi là một đối số cho hàm phía trên nó. Bạn có thể thấy điều tương tự trong JavaScript khi bạn cố gắng làm điều gì đó như return { ... }.
Cezary Wojcik

16

Chỉ cần FYI, Xcode đã xây dựng mã đầy đủ như sau:

autoreleasepool({ () -> () in
    // code              
})

Đoán các dấu ngoặc đơn xác định các hàm đóng.


3
không chắc chắn lý do tại sao bất cứ ai de-bình chọn nhận xét này, như anh ấy chỉ ra rằng bể bơi autorelease như xa như swift1.2 cần mã được bọc trong một kết thúc
bolnad

7

Có! Nó chỉ thực sự không được đề cập ở bất cứ đâu.

autoreleasepool {
    Do things....
}

0

Tôi đã sử dụng loại cấu trúc này trong mã của mình. Chức năng này là tạo hình ảnh thu nhỏ từ URL video.

func getThumbnailImage(forUrl url: URL) -> UIImage? {
    return autoreleasepool{ () -> UIImage in
        let asset: AVAsset = AVAsset(url: url)
        let imageGenerator = AVAssetImageGenerator(asset: asset)
        var thumbnailImage: CGImage?
        do {
            thumbnailImage = try imageGenerator.copyCGImage(at: CMTimeMake(value: 1, timescale: 60) , actualTime: nil)
            return UIImage(cgImage: thumbnailImage!)
        } catch let error {
            print(error)
        }
        return UIImage(cgImage: thumbnailImage!)
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.