iOS 메모리 관리 기본 0

2500 단어

oc 대상의 인용 계수 시기


최근에 이런 문제를 명상했다. 우리는 ARC 메커니즘이 간단하고 효과적으로 oc 대상의 생명주기를 관리하는 방식이라는 것을 알고 있다. 하나의 실례가 만들어질 때 실례의 인용 계수는 1이 되고 새로운 바늘이 실례를 가리킬 때 인용 계수는 2가 되고 바늘이 이 실례를 가리키지 않을 때 인용 계수는 0이 된다. 이때 ARC 메커니즘은 이 실례를 없애고 메모리를 회수한다.그렇다면 NSObject류에 계승된 실례는 인용계수가 언제 처음으로 +1되었을까, alloc이었을까, 아니면 init이었을까, 아니면 언제였을까?
이것은 매우 기초적인 문제로, 우리는 아래의 세 가지 상황으로 나누어 분석한다
시나리오 1:
사실 우리는 새로운 실례가 만들어진 후에 강제로 인용되기만 하면 그 인용 계수는 반드시 +1이 된다는 것을 알고 있다. 그러면 한 함수에서 만약에 우리가 하나의 실례만 만들었다면:
- (void)test {
    [[NSObject alloc] init];
}

이 실례의 인용 계수는 어떤 것입니까?우리는 alloc일 때 실례의 메모리가 분배되고 init일 때 실례 내부의 속성 등이 만들어진다는 것을 알고 있지만 그 어떠한 대상이나 속성에 인용되지 않아 바늘에 가리키지 않았다고 볼 수 있다. 따라서 이때 실례의 인용 계수는 0이고 test 함수를 집행한 후에 실례는 소각된다.
시나리오 2:
- (void)test {
    NSObject *obj = [[NSObject alloc] init];
    NSLog(@" :%lu", (unsigned long)[obj retainCount]);
}

그렇다면 실례의 인용 계수는 얼마나 될까?답은: :1, 실례가 만들어진 후 obj 변수의 지침에 의해 가리키게 되었다. 즉, objc 변수가 이 실례를 가지고 있기 때문에 인쇄 결과는 1이다.마찬가지로 test 함수를 실행한 후 실례는 삭제됩니다.
상황 3:
#import "ViewController.h"

@interface ViewController ()

@property(nonatomic, strong) NSObject *obj;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [self test];
    NSLog(@" :%lu", (unsigned long)[self.obj retainCount]);
}

- (void)test {
    NSObject *obj = [[NSObject alloc] init];
    NSLog(@" :%lu", (unsigned long)[obj retainCount]);
    self.obj = obj;
    NSLog(@" :%lu", (unsigned long)[obj retainCount]);
}
@end

이때 두 번의 로그는 어떨까요?답은: :1, :2, :2입니다.[[NSObject alloc] init] 실례가 만들어진 후 objself. obj 두 변수의 지침이 가리키는데...함수가 끝난 후 ViewControllerself. obj10self. obj을 가지고 있기 때문에 그 인용계수는 0이 되지 않는다.

인용 계수와 방법 작용역


상기 상황 2에서 최종 [[NSObject alloc] init] 실례는 폐기될까?답은 함수의 작용역과 관계가 있는 것이다. 함수 중의 국부 변수는 에 있다. 예를 들어 상황2의 obj 변수는 그 본질은 하나의 지침이다. 함수가 끝날 때 시스템은 이 지침을 방출한다.따라서 함수가 끝날 때 바늘이 실례를 가리키지 않고 인용 계수가 0이면 ARC 환경에서 자동으로 이 실례를 삭제한다.
iOS의 메모리 저장 영역, 순환 인용 & 순환 인용의 본질을 알고 싶으면 iOS 메모리 관리 기초 1로 이동하세요.

좋은 웹페이지 즐겨찾기