Strong reference cycle
//
// ViewController.swift
// FirstNewApp
//
// Created by KIM Hyung Jun on 2023/06/29.
//
import UIKit
import AVFoundation
class ViewController: UIViewController {
@IBOutlet weak var mainLabel: UILabel!
@IBOutlet weak var slider: UISlider!
weak var timer: Timer?
var number: Int = 0
override func viewDidLoad() {
super.viewDidLoad()
configureUI()
}
func configureUI() {
mainLabel.text = "์ด๋ฅผ ์ ํํ์ธ์"
slider.value = 0.5
}
@IBAction func sliderChanged(_ sender: UISlider) {
// ์ฌ๋ผ์ด๋์ value ๊ฐ์ ๊ฐ์ง๊ณ ๋ฉ์ธ๋ ์ด๋ธ์ ํ
์คํธ๋ฅผ ์ธํ
let seconds = Int(slider.value * 60)
mainLabel.text = "\(seconds)์ด"
number = seconds
}
@IBAction func startButtonTapped(_ sender: UIButton) {
// 1์ด์ฉ ์ง๋๊ฐ ๋๋ง๋ค ๋ฌด์ธ๊ฐ๋ฅผ ์คํ
timer?.invalidate()
// timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(doSomethingAfter1Second), userInfo: nil, repeats: true)
timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { [self] _ in
// ๋ฐ๋ณต์ ํ๊ณ ์ถ์ ์ฝ๋
if number > 0 {
number -= 1
// ์ฌ๋ผ์ด๋๋ ์ค์ฌ์ผํจ
slider.value = Float(number) / Float(60)
// ๋ ์ด๋ธ ํ์๋ ๋ค์ ํด์ค์ผ ํจ
mainLabel.text = "\(number)์ด"
}
else {
number = 0
mainLabel.text = "์ด๋ฅผ ์ ํํ์ธ์"
timer?.invalidate()
// ์๋ฆฌ๋ฅผ ๋๊ฒ ํด์ผํจ
AudioServicesPlayAlertSound(SystemSoundID(1322))
}
}
}
// @objc func doSomethingAfter1Second() {
// if number > 0 {
// number -= 1
// // ์ฌ๋ผ์ด๋๋ ์ค์ฌ์ผํจ
// slider.value = Float(number) / Float(60)
// // ๋ ์ด๋ธ ํ์๋ ๋ค์ ํด์ค์ผ ํจ
// mainLabel.text = "\(number)์ด"
// }
// else {
// number = 0
// mainLabel.text = "์ด๋ฅผ ์ ํํ์ธ์"
// timer?.invalidate()
// // ์๋ฆฌ๋ฅผ ๋๊ฒ ํด์ผํจ
// AudioServicesPlayAlertSound(SystemSoundID(1322))
// }
// }
@IBAction func resetButtonTapped(_ sender: UIButton) {
// ์ด๊ธฐํ ์ธํ
mainLabel.text = "์ด๋ฅผ ์ ํํ์ธ์"
slider.value = 0.5
number = 0
timer?.invalidate()
// slider.setValue(0.5, animated: false)
}
}
Swift
๋ณต์ฌ
weak var timer: Timer?
Swift
๋ณต์ฌ
์ด๋ ๊ฒ weak ์ผ๋ก ์ ์ธ์ ํด์ฃผ์๊ธฐ ๋๋ฌธ์, Strong Reference Cycle์ด ์ผ์ด๋์ง ์๋๋ค.
๊ทธ๋์ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๊ฐ ์๋ ์ ์๋ค.
timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { [self] _ in
Swift
๋ณต์ฌ
๋ํ ์ฌ๊ธฐ์
[weak self]๋ก ํ์ง ์์๋ ๋๋ค!
Swift
๋ณต์ฌ