deprecated/잡동사니

iOSInterviewquestions - ARC

lgvv 2022. 4. 2. 03:02

iOSInterviewquestions - ARC

 

목적 : 배울때는 잘했는데, 나이가 먹으니까 자꾸 까먹어서 아래 깃허브 글을 바탕으로 꾸준히 이론 공부를 하고자 함. 물론 설명은 내가 잘 아는게 목적이라 철저히 나를 이해시킬 수 있는 나의 언어로 작성.

 

작성일 : 2022년 4월 2일 

 - README: 추후에 수정이 있을 경우 아래에 날짜와 시각을 작성하고, 수정 내용을 간략히 정리해주세요.

 

예시)

(수정) oooo년 oo월 oo일 oo시 oo분 

 - 변경내용 : xxx에 대한 자료를 보강

 

✅ 공부의 기준이 되는 깃허브 글

https://github.com/JeaSungLEE/iOSInterviewquestions

 

GitHub - JeaSungLEE/iOSInterviewquestions: 👨🏻‍💻👩🏻‍💻iOS 면접에 나올 질문들 총 정리

👨🏻‍💻👩🏻‍💻iOS 면접에 나올 질문들 총 정리 . Contribute to JeaSungLEE/iOSInterviewquestions development by creating an account on GitHub.

github.com

 

✅ ARC

  • ARC란 무엇인지 설명하시오.
    • Auto Reference Count의 약자로 앱의 참조 메모리를 자동으로 관리해주는 역할을 합니다. 과거 Obj-c를 사용할 때는 release, retain 등과 같은 코드를 수동으로 삽입해 주었지만, ARC는 컴파일 타임에 자동으로 release, retain코드를 삽입하고, 런타임 때 이들을 실행하여 reference count를 증감시킵니다. 만약 reference count가 0이 되면 deinit을 통해 메모리에서 해제합니다.
    • (참고) https://github.com/SwiftFrequency/iOSInterview/issues/7

 

  • Retain Count 방식에 대해 설명하시오.
    • ARC는 자동으로 reference count를 관리해 주었다면, Retain count는 MRC에서 사용되는 용어로 MRC는 수동으로 관리한다. MRC의 경우 개발자가 직접 count를 해서 인스턴스에 대한 RC에 접근할 수 있는 프로퍼티가 존재하는데, 그 프로퍼티 이름이 retainCount이다. 또한 MRC를 retain/release 개념으로 생각해서 MRR(Memory Retain Release)라고도 부르는 것을 보면 retain count가 맞다.
    • (참고) https://babbab2.tistory.com/28

 

  • Strong 과 Weak 참조 방식에 대해 설명하시오.
    • strong : 강함참조로써 해당 인스턴스의 소유권을 가진다. 자신이 참조하는 인스턴스의 retain count를 증가시키며, 값 지정 시점에 retain이 되고, 참조가 종료되는 시점에 relase가 된다. 선언할 때 아무것도 적어주지 않는다면 default로 strong이 된다.
    • weak : 해당 인스턴스의 소유권을 갖지 않고 주소값만을 갖는 포인터 개념이다. 자신이 참조하는 인스턴스의 retain count를 증가시키지 않는다. relase도 발생하지 않는다. 자신이 참조는 하지만 weak 메모리를 해제시킬 수 있는 권한은 다른 클래스에 있다. 메모리가 해제될 경우 자동으로 레퍼런스가 nil로 초기화 해준다.
    • unowned (미소유 참조/ 약한 참조) : 해당 인스턴스의 소유권을 가지지 않는다. 자신이 참조하는 인스턴스의 retian count를 증가시키지 않는다. nil이 될 수 없다. optional로 선언되어서는 안된다.
    • // 강한참조
      var test = Test() // retain count 1증가
      test = nil // retain count가 1 감소되어서 0이 되면서 메모리가 해제된다.
      
      // 약한참조
      weak var test = Test() // 객체가 생성되지만, weak이기 때문에 바로객체가 해제되어 nil이 된다.
      
      // unouned
      unowned var test = Test() // 객체 생성과 동시에 해제되고 댕글링 포인트만 갖고 있음. 에러가 난다.
    • [weak과 unowned의 차이] 
      • weak은 객체를 계속 추적하면서 객체가 사라지게 되면 nil로 바꾼다.
      • 하지만 unowned는 객체가 사라지게 되면 댕글링 포인터가 남는다. 이 댕글링 포인터를 참조하게 되면 crash가 나는데, 이 때문에 unowned는 사라지지 않을 것이라고 보장되는 객체에만 설정하여야 한다.
      • 댕글링 포인터란? : 원래 바라보던 객체가 해제되면서 할당되지 않는 공간을 바라보는 포인터
    • 각각의 사용 상황
      • strong : 레퍼런스 카운트를 증가시켜 ARC로 인한 메모리 해제를 피하고 객체를 안전하게 사용하고자 할 때 쓰임
      • weak : 대표적으로 retian cycle에 의해 메모리가 누수되는 문제를 막기 위해서 사용되고 delegate 패턴이 있다.
      • unowned : 객체의 라이프사이클이 명확하고 개발자에 의해 제어 기능이 명확한 경우, weak optional 타입 대신 사용하여 조금 더 간결한 코딩이 가능하다. 
      • 약한 참조가 필요한 경우 weak 키워드만 사용하고 guard let 또는 if let을 통하여 안전하게 옵셔널을 추출하는 것을 권장한다.
    • (참고) https://devsrkim.tistory.com/entry/Swift-%EB%A9%94%EB%AA%A8%EB%A6%AC%EB%A5%BC-%EC%B0%B8%EC%A1%B0%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95-Strong-Weak-Unowned

 

  • 순환 참조에 대하여 설명하시오.
    • 서로가 서로를 참조하고 있어 메모리가 해제되지 않는 것을 의미한다.
    • ARC가 메모리 관리를 도와주지만 순환 참조에 빠질 수 있다.
    • class VC1 { 
         let vc2 = VC2()
      }
      
      class VC2 { 
         weak var delegate: VC1
      }
    • VC1이 VC2를 참조하고 있고, VC2에서는 weak를 사용함으로써 retain count가 증가하지 않아서 이를 해결할 수 있다.

 

  • 강한 순환 참조 (Strong Reference Cycle) 는 어떤 경우에 발생하는지 설명하시오.
    • class Person { 
         var name = "lgvv"
         var car: Car?
      }
      
      class Car { 
         var model: String
         var lessee: String
         
         init(model: String) { 
            self.model = model
         }
      }
      
      var teacher: Person? = Person()
      var rentedCar: Car? = Car(model: "Benz")
      
      teacher?.car = rentedCar
      rentedCar?.lessee = teacher
      
      teacher = nil
      rentedCar = nil
    • Rx를 사용할 시에는 bind, map 등에서 self를 사용할 때 weak을 해주지 않아서 발생한다.
    • (참고) https://beenii.tistory.com/115

 

 

 

 

'deprecated > 잡동사니' 카테고리의 다른 글

iOSInterviewquestions - iOS  (1) 2022.04.06
iOSInterviewquestions - Rx  (0) 2022.04.02
iOSInterviewquestions - Swift  (0) 2022.04.02
iOSInterviewquestions - Autolayout  (0) 2022.04.02
[iOS] 🗺 KakaoMap API 환경설정  (0) 2022.02.18