- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - phát hiện rò rỉ bộ nhớ Ruby/Ruby on Rails
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
传统上在 Objc 中,我们使用 weakSelf 来防止 block 的额外保留计数。
swift 如何在内部管理 Objc block 中发生的保留周期?
câu trả lời hay nhất
要防止 block 持有对对象的强引用,您必须为 block 定义捕获列表。
闭包表达式语法定义如下:
{ ( /*parameters*/ ) -> /*return type*/ in
// statements
}
但这在文档的后面进行了扩展以包括捕获列表。这实际上等同于如下定义的表达式语法:
{ [ /*reference type*/ /*object*/, ... ] ( /*parameters*/ ) -> /*return type*/ in
// statements
}
...其中 /*reference type*/
可以是 weak
hoặc unowned
。
捕获列表是第一个出现在闭包中的东西,它是可选的。如上所示,语法定义为一对或多对引用类型后跟对象;每对由逗号分隔。例如:
[unowned self, weak otherObject]
完整示例:
var myClosure = {
[unowned self] in
print(self.description)
}
Xin lưu ý rằngunowned
引用是非可选的,因此您无需将其解包。
希望这能回答您的问题。您可以在 tài liệu 的相关部分阅读有关 Swift 中 ARC 的更多信息.
您应该特别注意weak
Vàunowned
之间的区别。在您的实现中使用 weak
可能更安全,因为使用 unowned
假定对象永远不会为 nil。如果该对象在您的闭包中使用之前实际上已被释放,这可能会导致您的应用程序崩溃。
sử dụngweak
作为引用类型,应该用?
解包,如下:
var myClosure = {
[weak self] in
print(self?.description)
}
关于swift - 在 Swift 中阻止保留循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24042949/
Có cách nào để khai báo hàm trong tệp .swift (được biên dịch thành mô-đun .swift) như sau: hello.swift func hello_world() { println("hello world")
Tôi đang cố gắng thực hiện MUC trên iOS bằng xmpp_messenger_ios và XMPPFramework Đây là mã để tham gia phòng. func createOrJoinRoomOnXMPP()
Tôi muốn tạo lối tắt 3D Touch trên ứng dụng của mình, tôi đã thực hiện mọi thứ về chính lối tắt đó và nó hiển thị chính xác, kèm theo văn bản và biểu tượng. Khi tôi chạy phím tắt này, ứng dụng của tôi gặp sự cố vì AppDelegate
Mã của tôi như sau: let assetsTag = Expression("asset_tag") let query2 = mdm.select(mdm[assetTag],os, mac, LastRe
Mã Swift của tôi trông giống như Family.arrayTuple:[(String,String)]?
Đây là JSON của tôi, khi tôi đọc dữ liệu ord và uniq, tôi gặp lỗi let reply2: [String: Any] = ["Response":["status://SUCCESS","
Tôi muốn di chuyển các tệp tiện ích mở rộng Swift vào gói Swift. Tuy nhiên, sau khi di chuyển các tập tin sang gói Swift, tôi gặp phải lỗi này: "Loại 'NSAttributionString' không có thành viên 'ma
Sử dụng CocoaPods, chúng ta có thể đặt cấu hình sau: pod 'SourceModel', :configurations => ['Debug'] Có cách nào để thực hiện việc này bằng Swift Package Manag không
Tôi đang phát triển một dự án nhanh chóng trong Xcode. Tôi gọi nó là dự án chính. Tôi làm việc chủ yếu. Tôi gặp rắc rối với bộ chọn ngày, phạm vi ngày và phép toán ngày, vì vậy tôi đã bắt đầu một dự án khác có tên StarEndDate.
Đây là mã ObjectiveC: CCSprite *progress = [CCSprite spriteWithImageNamed:@"progress.png"]; mProgressBar
Tôi đang tạo một công cụ dòng lệnh bằng Swift trong Xcode. Tôi muốn sử dụng tệp cấu hình tương tự như grunt, nhưng tôi muốn nó là mã nhanh như tệp pack.swift của trình quản lý gói Swift
Tôi cho rằng điều này có nghĩa là chạy tập lệnh bằng cách sử dụng bất kỳ Swift nào được cài đặt trên hệ thống: #!/usr/bin/swift Làm cách nào để chỉ định tập lệnh áp dụng cho phiên bản trình thông dịch nào? Câu trả lời hay nhất Cato có thể được sử dụng tại đây: #!/usr/bin/env cato 1.2
Mã cho biết nó hoàn toàn ổn, không có lỗi, nhưng khi tôi chạy trình mô phỏng, nó xuất hiện: (Swift.LazyMapCollection (_base:[] Tôi đang cố gắng tạo một ứng dụng trích dẫn hiển thị các trích dẫn. Đây là quá trình nhập
Có thể sử dụng RealmSwift trên máy chủ chạy Swift (ví dụ: Perfect, Vapor, Kitura, v.v.) và sử dụng nó để lưu trữ dữ liệu không? (Tôi đang nghĩ đến việc thử giải pháp này thay thế cho giải pháp khác như không
Tôi mới bắt đầu học lập trình và đang cố gắng hoàn thành các thí nghiệm trong sách lập trình Swift. Nó hỏi ""Viết hàm so sánh hai giá trị Thứ hạng bằng cách so sánh giá trị thô của chúng. ” enum Xếp hạng: Int { case Ace = 1 ca
Trước khi bạn đánh dấu câu hỏi này là trùng lặp, tôi đã kiểm tra câu hỏi này và nó không hiệu quả với tôi. Cách khắc phục lỗi này: lỗi: SWIFT_VERSION '5.0' không được hỗ trợ, suppo
Kể từ Xcode 9.3, tôi đang gói các biến chuỗi trong mô hình của mình bằng cách sử dụng "Swift.ImplicitlyUnwrappedOptional.some" Tôi không biết điều này xảy ra như thế nào nhưng nó đã phá hỏng ứng dụng của tôi!
Câu hỏi này đã có câu trả lời ở đây: Làm cách nào để đưa tệp .swift từ tệp .swift khác vào chế độ ngay lập tức?
Tôi đang tạo một ứng dụng bằng Trình quản lý gói Swift và tôi cần biết cấu hình để xây dựng dự án, tức là Gỡ lỗi hoặc Phát hành. Tôi đang cố gắng tránh sử dụng tệp .xcodeproj. Xin vui lòng ai đó cho tôi biết nếu điều này
Có một tệp bar.swift với định nghĩa hàm: func bar() { println("bar") } và một tập lệnh foo.swift chạy ở chế độ ngay lập tức: #!/usr/bin/xcrun s
Tôi là một lập trình viên xuất sắc, rất giỏi!