iOS 메모리 관리 기본 0
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]
실례가 만들어진 후 obj
과 self. obj
두 변수의 지침이 가리키는데...함수가 끝난 후 ViewController
이 self. obj
10self. obj
을 가지고 있기 때문에 그 인용계수는 0
이 되지 않는다.인용 계수와 방법 작용역
상기 상황 2에서 최종
[[NSObject alloc] init]
실례는 폐기될까?답은 함수의 작용역과 관계가 있는 것이다. 함수 중의 국부 변수는
에 있다. 예를 들어 상황2의 obj
변수는 그 본질은 하나의 지침이다. 함수가 끝날 때 시스템은 이 지침을 방출한다.따라서 함수가 끝날 때 바늘이 실례를 가리키지 않고 인용 계수가 0
이면 ARC 환경에서 자동으로 이 실례를 삭제한다.iOS의 메모리 저장 영역, 순환 인용 & 순환 인용의 본질을 알고 싶으면 iOS 메모리 관리 기초 1로 이동하세요.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.