iOS 자동 풀 풀 블록




memory-management objective-c-blocks (2)

(대부분 그냥 배경을 추가하면 @ Kibitz503이 올바른 답을 얻습니다.)

@autoreleasepool {

  MyObject *obj = [[MyObject alloc] init]; // no autorelease call here

  /* use the object*/
  //....
  // in the end it should get deallocated because it's lifespan ends, right?
  // so why do we need to call autorelease then?!
}

추신 : 제발 ARC 때문에 우리는 ARC가 그들을 돌봐주기 때문에 몇 가지 일을 할 필요가 없다고 말해주지 마십시오. 나는 그 사실을 충분히 인식하고 있지만 잠시 동안 메모리 관리의 메커니즘을 이해하기 위해 ARC를 제쳐두고 떠나고 싶습니다.

좋습니다, ARC를 고려하지 않겠습니다. 위의 경우 ARC가 없으면 obj 는 할당 해제되지 않습니다. ARC가 추가 release 호출을 추가하기 때문에 ( use the objectuse the object 어떤 일이 발생하는지 모르기 때문에 실제로 예제가 없기 때문에) 할당 취소가 발생할 수 있습니다.

@ Kibitz503에 따르면 "릴리스"는 "할당 취소"를 의미하지 않습니다. 블록이 끝나면 autorelease 풀이 autorelease 보류중인 autorelease 호출은 블록 끝 부분에서 release 로 전송됩니다. 이 값이 0에 도달하면 오브젝트는 할당 해제됩니다.

그러나 위의 내용이 블록인지 여부에 관계없이 ARC가 없으면 누설입니다.

나는 autorelease pool block에 도착했을 때 메모리 관리에 대한 apple의 문서를 읽고 있었는데 뭔가 생각이났습니다.

 Any object sent an autorelease message inside the autorelease pool block is  
 released at the end of the block.

나는 이것을 완전히 이해하고 있는지 확신하지 못한다. autorelease 풀 블록 내부에서 생성 된 객체는 수명이 다르기 때문에 블록 끝에서 해제됩니다. 블록의 끝 부분에 도달했을 때 어쨌든 해제 될 때 왜 객체에 자동 회수를 호출해야합니까?

명확하게하기 위해 나는 내가 생각하는 것을 보여줄 것이다.

   @autoreleasepool {

    MyObject *obj = [[MyObject alloc] init]; // no autorelease call here

    /* use the object*/
   //....
   // in the end it should get deallocated because it's lifespan ends, right?
   // so why do we need to call autorelease then?!
  }

추신 : 제발 ARC 때문에 우리는 ARC가 그들을 돌봐주기 때문에 몇 가지 일을 할 필요가 없다고 말해주지 마십시오. 나는 그 사실을 충분히 인식하고 있지만 잠시 동안 메모리 관리의 메커니즘을 이해하기 위해 ARC를 제쳐두고 떠나고 싶습니다.


Autorelease는 객체에서 retain count를 제거하기 만하면 c에서와 같이 즉시 메모리를 "비 웁니다". autorelease 풀이 끝나면 자동으로 해제 된 모든 객체의 카운트가 0이되어 메모리가 해제됩니다.

때로는 많은 오브젝트를 생성합니다. 예를 들어, 문자열을 반복하고 새 문자열을 문자열에 추가 할 때마다 새 문자열을 만드는 루프가 그 예입니다. 이전 버전의 문자열은 필요하지 않을 수 있으며 해당 문자열이 사용하는 메모리를 비울 수 있습니다. autorelease 풀이 자연스럽게 수행되기를 기다리는 대신 명시 적으로 사용하여이를 수행 할 수 있습니다.

//Note: answers are psudocode

//Non Arc Env
@autoreleasepool 
{

    MyObject *obj = [[MyObject alloc] init]; // no autorelease call here
    //Since MyObject is never released its a leak even when the pool exits

}
//Non Arc Env
@autoreleasepool 
{

    MyObject *obj = [[[MyObject alloc] init] autorelease]; 
    //Memory is freed once the block ends

}
// Arc Env
@autoreleasepool 
{

    MyObject *obj = [[MyObject alloc] init]; 
    //No need to do anything once the obj variable is out of scope there are no strong pointers so the memory will free

}

// Arc Env
MyObject *obj //strong pointer from elsewhere in scope
@autoreleasepool 
{

    obj = [[MyObject alloc] init]; 
    //Not freed still has a strong pointer 

}




nsautoreleasepool