Objective-C 자동 방출 풀 AutoreleasePool 상세 정보

1821 단어 Objective-C
대상에게 autorelease 메시지를 보낼 때, 코코아는 이 대상의 인용을 최신 자동 방출 탱크에 넣습니다.프로그램의 실행이 끝날 때, 자동 방출 탱크는 방출되고, 탱크의 모든 대상도 방출된다. 즉release 작업을 한 번 실행하는 것이다.따라서 자동 방출 탱크는 OC의 메모리 자동 회수 메커니즘으로 일부 임시 변수를 자동 방출 탱크를 통해 통일적으로 회수하고 방출할 수 있다.
OC에서 작성한 iOS 프로젝트에서 main.m 파일의 코드는 다음과 같습니다: 자동 방출 탱크에 사용됩니다.
int main(int argc, char * argv[]) {
  @autoreleasepool {
      return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
  }
}

자동 방출 탱크를 어떻게 만드는지 봅시다. iOS5.0 이후의 새로운 방법:
 @autoreleasepool {
      ....
  }
는 위와 같다.m중의 것과 같다.만약 대상이 alloc를 사용하여 생성된다면, 반드시release나autorelease로 방출해야 한다는 것을 기억해야 한다.
이제 대상은 언제 풀어야 하는지 살펴볼까요?실행할 때, 대상이 어떤 대상에게 인용되지 않았을 때, 적당한 시간에 방출되면, 프로그램은 언제 방출되었는지 포착할 수 없다.프로그램은 여러 개의 자동 방출 탱크가 있을 수 있고, 자동 방출 탱크도 서로 끼워 넣을 수 있다.
자동 풀을 사용하는 이유를 살펴보겠습니다.
for (int i = 0; i < 1000000; i++) {
NSString *string = [NSString stringWithString:@"ABC"];
NSLog(@"%@",string);
}

만약 프로그램에서 대량의 임시 대상이 발생한다면, 이때 자동 방출 탱크를 사용하는 것을 고려해야 한다.이렇게 계속 순환하면 메모리 유출 문제를 초래할 수 있다(메모리 유출은 더 이상 사용하지 않는 메모리를 방출하지 않아 우리가 이 메모리를 다시 사용할 수 없게 하는 것을 말한다.)이 임시 대상들은 전체 순환이 끝날 때까지 메모리를 계속 누적하여 분배할 것이다.우리가 해야 할 일은 매번 순환할 때마다 메모리를 방출하는 것이다.코드 수정은 다음과 같습니다.
for (int i = 0; i < 1000000; i++) {
@autoreleasepool {
NSString *string = [NSString stringWithString:@"ABC"];
NSLog(@"%@",string);
}
}

자동 방출 탱크는 대상의 자체를 포함하지 않고 방출할 대상의 인용을 포함한다.현재 자동 방출 탱크에 autorelease 메시지를 보내면 대상의 인용을 추가할 수 있습니다.자동 방출탱크가 시스템의 쓰레기 수집 메커니즘이 아니라는 것을 주의해라.
마지막으로 우리는 자동 방출 탱크의 데이터 구조에 대해 이야기합시다.자동 방출 탱크는 창고의 구조로 새로운 자동 방출 탱크를 만들 때 창고 꼭대기에 놓인다.autorelease 메시지를 받은 대상은 이 자동 방출 탱크에 저장됩니다.
github 홈 페이지:https://github.com/chenyufeng1991  .여러분의 방문을 환영합니다!

좋은 웹페이지 즐겨찾기