---
# System prepended metadata

title: Untitled

---

**IBOutlet을 weak으로 설정한 이유**
- Default가 weak이라서 기본값을 따랐습니다.

**만약, 이것을 strong으로 바꿔도 작동하는가?**
- 정상적으로 작동합니다. 하지만, 아래와 같은 차이가 있습니다.
```swift
// weak를 사용했을 때

final class DetailViewController: UIViewController {
    
    @IBOutlet weak private var detailTextViewBottomConstraint: NSLayoutConstraint!
    @IBOutlet weak private var detailTextView: UITextView!
    var diaryData: SampleData?
    var indexPath: IndexPath?
    weak var delegate: DetailViewControllerDelegate?
```
viewDidLoad를 시작하는 시점에서
weak를 활용했을 때, detailTextView의 RC는 3이 됩니다.


```swift
// strong을 사용했을 때

final class DetailViewController: UIViewController {
    
    @IBOutlet private var detailTextViewBottomConstraint: NSLayoutConstraint!
    @IBOutlet private var detailTextView: UITextView!
    var diaryData: SampleData?
    var indexPath: IndexPath?
    weak var delegate: DetailViewControllerDelegate?
```
viewDidLoad를 시작하는 시점에서
strong을 활용했을 때, detailTextView의 RC는 4이 됩니다.

> weak를 활용했을 때에는 RC가 증가하지않게되므로 나타나는 결과입니다.

**이해가지 않는 부분**
##### strong으로 지정해줬을 때, 왜 viewdidLoad가 시작되는 시점에서 detailTextView의 RC는 4인가?

>RC1: view가 detailTextView를 강한참조(소유)하므로 
RC2: Interface Builder에서 가장 상위 View가 detailTextView를 소유하므로
RC3: vc에서 detailTextView가 strong
RC4: ???

##### storyboard를 삭제하면 RC - 1 ㅋㅋ

##### strong을 활용해야하는 경우

정말로 필요할 때, IBOutlet에 Strong을 써야 하는 경우가 있다고 합니다.
하지만, 아래 내용이 이해가 가지않네요...
아래는 블로그 글을 발췌하여 요약하였습니다.

> - 복잡한 뷰 Hierarchy를 가진 경우에는 Weak 대신 Strong을 써야만 하는 경우도 존재함
> - 깊은 뷰 Hierarchy 구조에서 모든 Connection이 Weak라고 한다면 중간쯤 있는 View가 어느 이유에서인지 dealloc이 된다면? 그 하위뷰들도 함께 dealloc이 됨
> - 만약 복잡한 뷰 Hierechy 구조상에서 subview의 subview를 사용해야 하는 경우. 의도치 않은 nil을 경험할 수도 있습니다. 일반적이지는 않지만 충분히 겪을 수 있음



RC는 
viewDidLoad -> 6

- weak으로 설정하면 RC는 1만 올라가는데 
- strong으로 설정시 RC는 2가 되지용 히히

![](https://i.imgur.com/YC7YyhR.jpg)

**VC에 비즈니스 로직이 많아지는 경우**
만약, 비즈니스 로직이 너무 많아진다면 별도의 모델을 구성하여 관리하는 편이 좋을 것 같다는 생각이 드네요.
VC파일에 VC 클래스 이외 불필요한 코드도 줄이고 extension을 활용한느 것보다 가독성이 좋을 수 도 있겠다는 생각도 듭니다.

**현재 프로젝트의 비즈니스로직을 어떻게 처리할 것인가?**
1. 비즈니스로직에 디펜던시가 있는 상태이므로 해당 기능을 활용하는 뷰컨트롤러에서 fileprivate extension을 구성하려고 합니다.
(왜? 단지 하나의 로직을 처리하려고 별도의 모델을 생성하는 것은 그리 좋지 않은 방법이라는 생각에 위 방법을 선택했습니다.)
2. VC에 비즈니스 로직이 많아질 때는 위의 답과 동일하게 대처하려합니다.




![](https://i.imgur.com/HrY2TUV.png)


applicationWillResignActive(UIApplication), sceneWillResignActive(UIScene)
앱이 Active 상태를 포기했을 때 호출되는 메서드입니다. (Active -> In-Active)

UIKit은 이 메서드를 호출하여 앱이 Active -> In-Active 상태로 변한 것을 알 수 있습니다. 홈 화면으로 나가거나 제어 센터, 알림 센터를 사용할 때 In-Active 상태가 되므로 호출됩니다. 앱에 저장되지 않은 사용자 데이터가 있다면 저장하게 됩니다. 하지만 이러한 방법보다는 특정 시점에 사용자 데이터를 저장하는 것이 좋다고 해요!

UIKit은 이 메서드를 호출 한 뒤 willResignActiveNotification이라는 Notification을 post 해서 앱 전체에서 해당 이벤트를 처리할 수 있도록 해줍니다.