iOS 인터뷰 준비 1 — 메모리 관리
메모리 관리는 iOS 인터뷰에서 가장 자주 묻는 질문 중 하나입니다. 참조 순환, 강한/약한 참조와 같은 기본 개념에 대한 좋은 이해를 보여주지 못하면 큰 위험 신호입니다. 메모리 관리와 관련된 모든 종류의 질문에 대비하려면 ARC 커튼 뒤에 있는 기본 메커니즘을 이해하는 것이 중요합니다.
인터뷰 질문들
- Obj-C/Swift에서 ARC가 작동하는 방식 설명
- 메모리 누수를 유발할 수 있는 일반적인 상황은 무엇입니까?
- 참조 순환이 발생할 수 있는 몇 가지 일반적인 시나리오는 무엇입니까?
- 언제 복사 속성을 사용해야 합니까? 버그를 피하는 데 어떻게 도움이 됩니까?
- 소유되지 않은(안전하지 않은) 참조와 약한 참조의 차이점을 설명할 수 있습니까?
iOS 애플리케이션의 메모리 관리는 참조 카운팅 모델을 기반으로 합니다. 새 개체를 초기화하면 메모리가 힙에 할당되고 참조 횟수가 1로 설정됩니다. 참조 횟수는 더 많은 개체가 강력한 참조를 설정할수록 증가합니다.
반대로 소유자 개체가 강한 참조를 포기하면 참조 횟수가 1 감소합니다. 참조 횟수가 0이 되면 결과적으로 메모리가 소멸됩니다.
ARC 기능으로 코드를 컴파일할 때 컴파일러는 사용자가 생성한 참조를 가져와 기본 메모리 관리 메커니즘에 대한 호출을 자동으로 삽입합니다 .
강하고 약하고 소유되지 않은
ARC(Automatic Reference Counting)의 도입으로 개체를 참조할 때 소유권 유형만 지정하면 됩니다.
- 강력한 참조 — 참조가 유효한 동안 참조된 개체가 메모리에 남아 있도록 합니다.
- 약한 참조 — 참조된 객체의 수명에 영향을 미치지 않습니다.
- 소유되지 않은 참조 — 소유되지 않은 참조는 약한 참조처럼 강력한 보류를 유지하지 않습니다.
- 참조된 개체가 할당 해제되면 약한 참조는 nil로 설정되고 소유되지 않은 참조는 댕글링 포인터가 되어 메시지를 보내면 충돌이 발생합니다.
- Unowned는 다른 인스턴스의 수명이 같거나 더 긴 경우에 사용됩니다.
- 소유되지 않은 참조는 항상 값을 가질 것으로 예상되므로 ARC는 절대 값을 nil로 설정하지 않습니다.
- 객체를 유지하려면 strong을 사용하십시오 . 키워드 retain은 동의어이지만 대신 strong을 사용하는 것이 가장 좋습니다.
- 객체를 유지하지 않고 객체에 대한 포인터만 원하는 경우 약함을 사용하십시오. 유지 주기(예: 대리자)를 피하는 데 유용합니다. 객체가 해제될 때 자동으로 포인터를 무효화 합니다 .
- 프리미티브에 assigns 사용 — 해제될 때 객체를 nil out하지 않는다는 점을 제외하고는 weak와 동일합니다(기본값으로 설정됨).
ARC 뒤에 있는 참조 할당에 대해 잘 이해하고 있다면 참조 순환의 개념을 이해하기가 정말 쉬울 것입니다. 두 객체가 강한 참조의 원으로 연결되어 있으면 다른 강한 참조가 없더라도 서로를 활성 상태로 유지합니다.
클로저/블록의 참조 순환
강한 참조 순환이 도입될 수 있는 일반적인 상황 중 하나는 클로저/블록을 사용할 때입니다. 클래스 인스턴스의 속성에 클로저/블록을 할당하고 해당 클로저/블록의 본문이 인스턴스(self)를 캡처하는 경우 강력한 참조 순환이 발생할 수 있습니다. 속성에 할당하지 않고 단순히 새 블록을 만들면 참조 순환이 발생하지 않습니다.
- (void)configureBlock {
// capture the weak reference to avoid the reference cycle
XYZBlockKeeper * __weak weakSelf = self;
self.block = ^{
__strong typeof(self) strongSelf = weakSelf;
if (strongSelf != nil) return;
[strongSelf doSomething];
}
}
lazy var someClosure = { [weak self] in
// closure body goes here
guard let strongSelf = self else { return }
}
selfGCD 클로저에서 강력하게 캡처하면 async참조 순환이 발생하지 않지만 수명이 연장 됩니다self. . 예를 들어 그 동안 해제된 뷰 컨트롤러에서 네트워크 요청을 하면 클로저는 여전히 호출됩니다. 뷰 컨트롤러를 약하게 캡처하면 가 됩니다. nil그러나 강하게 캡처하면 뷰 컨트롤러는 클로저가 작업을 완료할 때까지 활성 상태를 유지합니다.
Objective-C에서 속성 복사
실제로 우리는 NSString, NSArray와 같은 변경 가능한 버전이 있는 클래스에 대해 copy 속성을 사용합니다. 따라서 우리 속성은 자체 복사본을 유지하므로 원래 가변 변수가 업데이트되더라도 영향을 받지 않습니다.
@interface XYZBadgeView : NSView
@property NSString *firstName;
@property NSString *lastName;
@end
// If you need to set a copy property's instance variable directly
- (id)initWithSomeOriginalString:(NSString *)aString {
self = [super init];
if (self) {
_instanceVariableForCopyProperty = [aString copy];
}
return self;
}
- (void)example {
NSMutableString *nameString = [NSMutableString stringWithString:@"John"];
self.badgeView.firstName = nameString;
// If we don't create a copy then firstName will also be affected
// Because it points to the same object as nameString
[nameString appendString:@"ny"];
}
![연결된 목록이란 무엇입니까? [1 부]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































