传统上在Objc中,我们使用weakSelf来防止块的额外保留计数.
swift内部如何管理Objc块中发生的保留周期?
在教程中,它写的功能上都是相同的,甚至闭包更容易阻塞,它避免了块和内存管理的复杂性,我已经经历了很多教程,但除了这些我没有得到swift的"闭包"和Objective-C"阻止".
任何人都可以深刻解释这种差异.任何帮助,将不胜感激.
我是Swift的新手,当我遇到逃脱闭合时,我正在阅读手册.我根本没有得到手册的描述.有人可以用简单的语言向我解释一下Swift中有什么逃避封锁.
someFunction(completion: { [weak self] in
self?.variable = self!.otherVariable
})
Run Code Online (Sandbox Code Playgroud)
这总是安全吗?我self在语句的开头访问了可选项,并且我个人认为如果self是,那么该语句的第二部分将永远不会被执行nil.这是真的?如果self确实如此nil,第二部分永远不会发生?self在这一行代码中,它永远不会被"填充"?
正如Apple在"Swift编程语言"中所说,似乎我们应该unowned比weak任何可能的更喜欢:
如果捕获的引用永远不会变为nil,则应始终将其捕获为无主引用,而不是弱引用.
从本页的"弱和无主参考"部分
我确实知道这两者之间的区别.但我好奇的是有没有很好的理由,宁愿 unowned比weak?我认为weak更安全,我们可以总是编写[weak obj]和可选的绑定检查,而不考虑存在的可能性obj.
它与某些性能考虑或我错过的东西有关吗?或者是否完全可以使用weak而不是一直使用unowned?
我正在测试Xcode游乐场的快速关闭.
这是我的代码:
import UIKit
class A{
var closure: ()->() = {}
var name: String = "A"
init() {
self.closure = {
self.name = self.name + " Plus"
}
}
deinit {
print(name + " is deinit")
}
}
var a: A?
a = A()
a = nil
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,a是封闭自包含的,所以a永远不会释放.
但是,当我在最后一行之前添加这一行时:
a?.closure = { a?.name = "ttt" }
Run Code Online (Sandbox Code Playgroud)
然后,我在输出窗口中发现"A is deinit",这意味着a已被释放.为什么?是不是回收参考?
要进行测试,我使用一个函数来设置闭包,代码是版本2:
import UIKit
class A{
var closure: ()->() = {}
func funcToSetClosure(){
self.closure = { self.name = "BBB"}
}
var name: …Run Code Online (Sandbox Code Playgroud) 我正在创建我的第一个简单的预算应用程序.基本上,我采取一些用户输入,如月收入和储蓄目标.然后他们点击"开始",该应用程序计算诸如他们的每日预算等内容.
我遇到了麻烦.在完成所有计算之后,我会显示"你每天可以花多少钱"(例如每天20美元),然后通过原始屏幕上的原始输入传递segue.
现在,在这个VC(UserInfoVC)中我创建了一个按钮,让他们可以添加今天花了多少钱.因此,当他们点击这个"花钱"按钮时,我打开一个新的VC(AddSubtractMoney),在那里我会提供一个计算器,在那里他们可以输入他们今天花了多少钱(即12美元)并点击提交.
我将他们的输入与每日预算相比较,以获得新的每日预算.
现在,我无法向后传递这个更新的数字,将其显示在标签"dailySpendingLimitLabel"上的前一个VC上.我知道segues不是向后传递数据的最佳方式.
我已经尝试过闭包,但我最终迷失在语法,协议和代理中(这是我的第二个月编码).
有没有一种简单的方法可以将这些数据传回上一个VC并填充前一个显示标签中的数据?
下面是代码.
第一个片段来自UserInfoVC,我在其中显示我最初输入的数据.第二个片段来自AddSubtractMoney我放置计算器的类,并在函数内创建了一个对象"newestUpdate",允许我计算他们在计算器上输入的数字减去旧的每日预算.为了得到一个新的预算,我想向后呈现UserInfoVC.
class UserInfoViewController : ViewController {
var userNamePassedOver : String?
var userDailyBudgetPassedOver : Double = 99.0
var userDailySavingsPassedOver : Double = 778.00
var userMonthlyEarningsPassedOver : Double?
var userDesiredSavingsPassedOver : Double?
var newAmountPassedBack : Double = 0.0
@IBOutlet weak var dailySavingsNumberLabel: UILabel!
@IBOutlet weak var userNameLabel: UILabel!
@IBOutlet weak var dailySpendingLimitLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
userNameLabel.text = userNamePassedOver
dailySpendingLimitLabel.text = String(format: "%.2f", userDailyBudgetPassedOver) …Run Code Online (Sandbox Code Playgroud) 我有一个pageViewController显示每个索引的背景图像.它可以从左向右(向前)轻扫,但是当您反向滑动时,背景图像会相互重叠.在我实现背景图像之前,每个VC上的UI工作正常和反向,所以我知道它是背景图像.此外,如果我改为page curl而不是scroll在我的storyboard反向工作正常,只是不起作用scroll.这显然是一个已知的错误(从UIPageViewController中删除视图控制器)但是我需要一个Swift解决方案.
pageviewController:
func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
guard
let currentPageViewController = viewController as? SinglePageViewController,
let currentIndex = indexOfForecast(currentPageViewController.forecast!) as? Int where currentIndex != 0 else { return nil } //fixed bug where index was -0 only on scroll
return viewControllerAtIndex(currentIndex - 1)
}
func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
guard
let lastForecast = forecasts?.last,
let currentPageViewController = viewController as? SinglePageViewController, …Run Code Online (Sandbox Code Playgroud)