[iOS] Defer

RudinP·2024년 7월 12일
0

Study

목록 보기
253/258

Defer

코드의 실행을 Scope 종료 시점으로 연기시키는 방법

defer {
	statements
}
  • defer이 호출된 스코프의 실행이 끝나기 직전에 블록의 코드가 실행된다.

사용의의

import Foundation

func processFile(path: String) {
    //파일을 열고
    let file = FileHandle(forReadingAtPath:  path)
    
    //이렇게 되면 jpg파일은 파일을 연 뒤 닫지 않는 문제 발생
    if path.hasSuffix(".jpg"){
        return
    }
    
    //닫기
    file?.closeFile()
}
  • 해당 코드에서 jpg파일인 경우 return 전 파일을 닫아야함을 바로 파악 가능하다.
  • 하지만 코드가 길어지면 이런 부분을 찾기 힘들어지는데, 이 때 Defer문을 사용하면 해결 가능하다.
import Foundation

func processFile(path: String) {
    //파일을 열고
    let file = FileHandle(forReadingAtPath:  path)
    
    //함수가 끝나기 전까지 실행되지 않으며, 런타임 에러 발생한 것이 아니라면 함수가 끝나는 시점에 실행
    //여기에서는 언제나 끝날 때 close 함수가 실행되는 것
    defer {
        //닫기
        file?.closeFile()
    }
    
    if path.hasSuffix(".jpg"){
        return
    }

}
  • 만약 defer문 실행 전에 함수가 return된다면 defer문은 실행되지 않으므로, defer문은 return이 포함된 부분보다 앞에 작성해두는 것이 바람직하다.
import Foundation

func processFile(path: String) {
    //파일을 열고
    let file = FileHandle(forReadingAtPath:  path)
    
    //함수가 끝나기 전까지 실행되지 않으며, 런타임 에러 발생한 것이 아니라면 함수가 끝나는 시점에 실행
    //여기에서는 언제나 끝날 때 close 함수가 실행되는 것
        
    if path.hasSuffix(".jpg"){
        return
    }
    //jpg일경우 실행 안됨
    defer {
        //닫기
        file?.closeFile()
    }

}

한 스코프에 defer문이 여러개인 경우

  • defer문은 호출된 순서대로 코드를 예약
  • 첫번째 블록이 가장 먼저 예약되고, 실행될 때 가장 마지막으로 예약한 블록부터 실행되므로 3->2->1 순서가 된다. (defer문 호출과 반대의 순서)
  • 따라서 특별한 경우가 아니라면 defer문은 하나만 사용하는 것이 바람직하다.
profile
iOS 개발자가 되기 위한 스터디룸...

0개의 댓글