iOS 메모리 관리 규칙 에 대한 상세 한 사고

5656 단어 ios메모리 관리
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 문제
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기