2015-12-23 20 views
6

Tôi đang gặp sự cố lạ khi chụp một thể hiện của lớp @objc (viết nhanh, nhưng được chú thích với @objc và lớp con của NSObject). Nó xảy ra khi đóng cửa đang được gán và không khi được gọi, do đó, vấn đề không phải là giá trị bị bắt sẽ được deallocated và sau đó đóng cửa được gọi là. Nó xảy ra ngẫu nhiên, đôi khi nó bị treo sớm hơn, đôi khi sau đó. Tôi đã gặp lỗi này trong các phiên bản trước của Swift (tôi nghĩ nó là Swift 1.2), nhưng bây giờ tôi đang sử dụng 2.1 và nhận được sự cố này quá._swift_abortRetainUnowned khi chụp @objc class là united

Nó hoạt động tốt khi tôi thay đổi [unowned x] thành [weak x] và sau đó truy cập nó bằng vũ lực unwrapping x!.doSomething() dẫn tôi tin rằng đó là lỗi trong Swift, thay vì trong mã của tôi. Tuy nhiên trước khi mở một vé tại bugs.swift.org, tôi muốn nhận được nhiều hơn về điều này để đảm bảo rằng tôi không bỏ lỡ bất cứ điều gì.

Nó cũng đã được đề cập ở đây:
http://www.codeproject.com/Articles/791304/Resolving-strong-references-between-Swift-and-Obje
đây:
https://www.reddit.com/r/swift/comments/3vhwmj/unowned_bug_in_closure_causes_attempted_to_retain/
và ở đây:
https://forums.developer.apple.com/thread/9873

Nhưng khác hơn là thay đổi lại bản chụp ra weak và lực lượng unwrapping nó sau này, không có giải pháp .

+0

Các bạn đã từng tìm thấy nguyên nhân là gì và tại sao nó không được làm việc khi sử dụng không có chủ bên trong danh sách chụp? – Whirlwind

+0

Không, tôi đã phải thay đổi tất cả [unowned x] thành [weak x] để loại bỏ những sự cố này. –

Trả lời

2

Thông thường tôi thích sử dụng mã này thay vì unowned khi tôi đã làm với một số lớp objc bao gồm:

[weak self] in 
guard let strongSelf = self else { return } 
// use strongSelf below 
Các vấn đề liên quan