개발 토막 상식

iOS 개발자를 위한 토막 상식 7

Devleoper_yh 2025. 6. 3. 23:49
반응형

iOS 개발자를 위한 토막 상식, 일곱 번째

 


1. ViewController의 생명주기(Lifecycle)는 UIView와 다르게 동작한다.

  • ViewController는 메모리에 로드될 때 viewDidLoad, 사용자에게 보여지기 직전에 viewWillAppear, 보여진 후 viewDidAppear 등이 호출된다. 반면, UIView는 init, layoutSubviews, draw(_:) 등에서 주로 커스터마이징 된다.
  • 이 차이를 이해하면 UI 구성 타이밍과 네트워크 호출 시점을 정확히 잡을 수 있다.
override func viewDidLoad() {
    super.viewDidLoad()
    print("뷰가 메모리에 올라옴")
}

 


2. ARC는 강한 순환 참조를 해결하지 못하므로 weak 또는 unowned 키워드 사용이 필수이다.

  • 대표적으로 delegate 패턴에서는 메모리 누수를 막기 위해 weak으로 선언해야 한다.
  • 클로저 내부에서 self를 참조할 때도 캡처 리스트를 이용해 [weak self]를 써야 한다.
class MyViewController: UIViewController {
    weak var delegate: SomeDelegate?
}

 


3. 앱이 백그라운드 상태일 때 동작하는 코드에는 제한이 있으며, Background Modes 설정이 필요하다.

  • 예를 들어 위치 추적, 오디오 재생, 백그라운드 fetch 등을 수행하려면 Xcode 프로젝트 설정에서 명시적으로 백그라운드 모드를 활성화해야 한다.
<key>UIBackgroundModes</key>
<array>
    <string>location</string>
    <string>fetch</string>
</array>

 


4. AppDelegate와 SceneDelegate의 역할은 iOS 13부터 분리되었다.

  • AppDelegate는 앱 전체 라이프사이클(예: 푸시, 백그라운드 전환 등)을 관리하고,
  • SceneDelegate는 UI 씬의 상태 관리(예: 창이 열리고 닫히는 것)를 담당한다.
func sceneDidBecomeActive(_ scene: UIScene) {
    print("Scene이 활성화됨")
}

 


5. iOS에서 네트워크 요청은 반드시 ATS(App Transport Security)를 고려해야 한다.

  • HTTP가 아닌 HTTPS 통신을 권장하며, 예외적으로 HTTP를 사용하려면 Info.plist에 예외 설정을 추가해야 한다.
  • 보안 규정을 지키지 않으면 앱스토어 심사에서 리젝될 수 있다.
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

 

반응형