Tôi phát hiện ra Swift đóng cửa không giữ lại các biến bị bắt không giống như mong đợi của tôi.Việc đóng cửa Swift có giữ lại các biến bị bắt không?
class AAA {
}
var a1 = AAA() as AAA? // expects RC == 1
var a2 = {()->AAA? in return a1 } // expects RC == 2, retained by `Optional<AAA>`
a1 = nil // expects RC == 1
a2() // prints nil, ????
Tôi rất bối rối với điều này vì tôi đã tin rằng các biến bị bắt giữ sẽ được giữ lại theo mặc định. Nhưng, nếu tôi chụp nó một cách rõ ràng bằng cách sử dụng danh sách chụp, nó đang được giữ lại.
class AAA {
}
var a1 = AAA() as AAA?
var a2 = { [a1]()->AAA? in return a1 }
a1 = nil
a2() // prints {AAA}, alive as expected.
Tôi đọc lại hướng dẫn Swift, nhưng tôi không thể tìm thấy mô tả liên quan. Danh sách chụp được sử dụng để đặt unowned
một cách rõ ràng và tôi vẫn còn bối rối. Hành vi chính xác là gì và tại sao điều này lại xảy ra?
Không đúng sự thật. Ví dụ, 'func test() {var x = 42; cho f = {println (x)}; x = 43; f()}; test() 'in' 43', điều này có nghĩa là đóng cửa sẽ nắm bắt biến bằng cách tham chiếu, mặc dù nó tham chiếu biến mà không sửa đổi nó. – newacct
Cảm ơn @newacct. Mặc dù không nói rõ ràng những gì tôi đã viết, tài liệu này khiến tôi nghĩ rằng nó hoạt động theo cách đó. – Antonio
Có cách nào để buộc trình biên dịch nắm bắt bằng tham chiếu không? Tôi có một trường hợp mà tôi có hai đóng cửa mỗi cố gắng truy cập một giá trị được chia sẻ. Một đóng cửa thay đổi giá trị đã capture và giá trị kia chỉ đọc nó. Tuy nhiên, một trong đó đọc nó là nhận được một bản sao. Tôi cần phải ép nó để nắm bắt bằng cách tham chiếu. –