iOS 메모리 관리 규칙 에 대한 상세 한 사고
자신 이 생 성 한 생 성 대상 은 자신 이 가지 고 있다.
자신 이 만 든 대상 이 아니 라 자신 도 가 질 수 있다.
자신 이 가지 고 있 는 대상 이 필요 할 때 석방 하지 않 는 다.
자신 이 가지 고 있 지 않 은 대상 은 풀 어 줄 수 없다.
주:이곳 의 자신 은 대상 이 사용 하 는 환경 으로 프로그래머 자체 로 이해 해도 틀 리 지 않 습 니 다.
대상 조작 과 Objective-C 방법 대응
대상 조작
Objectivew-C 방법
대상 생 성 및 보유
alloc/copy/mutableCopy/new 또는 이 로 시작 하 는 방법
보유 대상
retain
석방 대상
release
폐기 대상
dealloc
자신 이 생 성 한 대상,자신 이 가지 고 있다.
//
id obj1 = [[NSObject alloc] init];
id obj2 = [NSObject new];
id obj3 = [obj2 copy];
copy 방법 은 NSCopying 방법 을 바탕 으로 클래스 의 copy With Zone 을 실현 합 니 다.mutableCopy 방법 은 NSMutableCopying 방법 을 바탕 으로 클래스 의 mutableCopyWithZone 을 실현 합 니 다.
자신 이 생 성 한 대상 이 아니면 자신 도 가 질 수 있다.
alloc/new/copy/mutableCopy 이외 의 방법 으로 얻 은 대상 은 자신 이 이 대상 의 소지 자가 아 닙 니 다.
// ,
// , 。
id obj = [NSMutableArray array];
id obj2 = [NSDictionary dictionary];
//
[obj retain];
[obj2 retain];
주:여기 가 좀 이해 가 안 돼 요.코드 부터 볼 게 요.
// ,
// , 。
id unretain_obj = [NSMutableArray array];
NSLog(@"unretain_obj retain count = %lu", (unsigned long)[unretain_obj retainCount]);
// release
[unretain_obj release];
상기 코드,우리 가 인쇄 한 결 과 는:2016-12-21 15:32:04.485 acm[65216:852108] unretain_obj retain count = 1
나중에 release 방법 을 호출 하면 프로그램 이 무 너 집 니 다!
인용 계수 에 따 르 면 이 때 는 untainobj 는 release 방법 을 한 번 실행 할 수 있 습 니 다.근 데 왜 우리 가 직접 호출 하면 프로그램 이 무 너 지 는 거 야?
우 리 는 처음에 언급 한 네 가지 사상 중 하 나 를 생각 할 것 이다.
자신 이 가지 고 있 지 않 은 대상 을 풀 수 없습니다.
이렇게 하면 우 리 는 잘 이해 할 수 있다.unretain 인쇄 되 었 지만obj 의 retainCount 는 1 이지 만 대상 을 인 용 했 기 때 문 이 라 고 설명 할 수 없습니다.그것 은 단순히 대상 의 존 재 를 얻 었 을 뿐이다.
그럼 문제 가 생 길 겁 니 다.그럼 이 상 대 는 누가 가지 고 있 나 요?
우 리 는 먼저 추측 을 하나 한다.
[NSMutable Array array]는 공장 방법 이기 때문에 array 에 서 는 NSMutable Array 인 스 턴 스 대상 을 생 성 해 야 합 니 다.이때 도 반드시 바늘 이 그것 을 인용 한 후에 이 대상 으로 돌아 갈 것 이다.so。。。
먼저 이곳 을 생각 한 후에 우 리 는 다시 가서 증명 하 자.
코드 를 다시 보 겠 습 니 다.
// ,
// , 。
id unretain_obj = [NSMutableArray array];
NSLog(@"unretain_obj retain count = %lu", (unsigned long)[unretain_obj retainCount]);
//
[unretain_obj retain];
NSLog(@"unretain_obj retain count = %lu", (unsigned long)[unretain_obj retainCount]);
//
[unretain_obj release];
NSLog(@"unretain_obj retain count = %lu", (unsigned long)[unretain_obj retainCount]);
결과 인쇄2016-12-21 15:40:20.774 acm[65682:861135] unretain_obj retain count = 1
2016-12-21 15:40:20.774 acm[65682:861135] unretain_obj retain count = 2
2016-12-21 15:40:25.254 acm[65682:861135] unretain_obj retain count = 1
프로그램 도 무 너 지지 않 습 니 다.
이로써 우리 위의 생각 도 실증 하 였 다.
retain 방법 을 통 해 자신 이 생 성 하지 않 은 대상 은 alloc/new/copy/mutableCopy 방법 으로 생 성 되 고 가지 고 있 는 대상 과 마찬가지 로 자신 이 가지 고 있 는 대상 이 되 었 기 때 문 입 니 다.
자신 이 가지 고 있 는 대상 이 필요 할 때 석방 되 지 않 습 니 다.
위의 예 를 통 해 우 리 는 자신 이 가지 고 있 는 대상 이 석방 할 때 release 방법 을 호출 한 다 는 것 을 알 고 있다.eg:
//
id release_obj = [[NSObject alloc] init];
//
[release_obj release];
/*
*
* release_obj , 。
* , 。
* EXC_BAD_ACCESS Crash
*/
우 리 는 스스로 하나의 방법 을 실현 하여 하나의 방법 으로 호출 할 수도 있 는 대상,즉 alloc 의 역할 을 되 돌려 줍 니 다.
- (id)allocObject {
//
id obj = [[NSObject alloc] init];
// alloc
return obj;
주:방법 명 생 성 및 소지 대상 에 부합 alloc/copy/mutableCopy/new 또는 이 로 시작 하 는 방법 규칙우 리 는 스스로 하나의 방법 을 실현 하여 아무 도 가지 고 있 지 않 은 대상 으로 돌아 가 대상 의 존 재 를 얻 을 뿐이다.
- (id)object {
//
id obj = [[NSObject alloc] init];
// autorelease , 。
[obj autorelease];
return obj;
autorelease 방법 은 대상 의 존 재 를 얻 을 수 있 지만 자신 은 대상 을 가지 고 있 지 않 습 니 다.대상 이 지정 한 생존 범 위 를 초과 할 때 자동 적 이 고 정확하게 방출 할 수 있 도록 합 니 다(release 방법 호출)autorelease 와 release 방법의 차이
autorelease:
release:
autorelease 의 상세 한 설명 은 저희 가 나중에 소개 하 겠 습 니 다.
우 리 는 또한 retain 방법 을 호출 하여 autorelease 방법 을 가 진 대상 이 스스로 eg 를 가지 도록 할 수 있다.
// ,
id unretain_obj = [NSMutableArray array];
//
[unretain_obj retain];
자신 이 가지 고 있 지 않 은 대상 을 풀 수 없습니다.자기가 풀 려 났 는데 계속 풀 려 나 고.
//
id release_obj = [[NSObject alloc] init];
//
[release_obj release];
//
[release_obj release];
/*
*
* release_obj , 。
* , 。
* EXC_BAD_ACCESS Crash
*/
대상 의 존재 만 가 져 와 대상 을 풀 려 고 합 니 다.
// ,
// , 。
id unretain_obj = [NSMutableArray array];
//
[unretain_obj release];
프로그램 충돌,보고 EXCBAD_ACCESS Crash 문제이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Swift의 패스트 패스Objective-C를 대체하기 위해 만들어졌지만 Xcode는 Objective-C 런타임 라이브러리를 사용하기 때문에 Swift와 함께 C, C++ 및 Objective-C를 컴파일할 수 있습니다. Xcode는 S...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.