autorelease 사용 장면

3750 단어 iOS

개술


autorelease는 release를 autorelease pooldrain으로 연기할 때입니다.ARC가 인용 계수 관리를 하는 메커니즘인데 매우 교묘하다.장면을 사용하는 것은, 나는retain의 대상이 되고, 나는release의 직책이 있지만, 지금은 그럴 수 없는 상황이다.후속 코드가retain을 원할 수도 있다는 것을 알고 있기 때문이다.
이 장면을 고려하면 우리는 대상을 되돌려주는 방법이 있다. 방법 내부에서 우리는retain이 대상을 만들었다. 이것은 우리가release라는 대상을 필요로 하고 대상 인용 계수의 균형을 유지해야 한다는 것을 의미한다.그러나 이 대상은 되돌아오는 값이기 때문에 호출자가 받은 대상이 회수되지 않았는지 확인해야 한다. 함수가 되돌아오기 전에release는 이 점을 확보할 수 없다.즉, 우리는release 반환값이 필요하지만, 함수가 반환되기 전까지는 안 된다는 것이다.이때 우리는 두 가지 선택이 있다.release를 늦추든지, 아니면 호출자가 우리를 도와release를 늦추든지.이것은 함수 반환값 인용 계수 문제를 해결하는 두 가지 방식에 대응한다.
    첫 번째 연기 release는 autorelease입니다. 함수가 되돌아오기 전에release를 하지 않고 먼저 되돌아오는 값을 autorelease pool에 잠시 저장합니다.이 기간 동안 호출자가 필요하면 리턴이라는 반환값을 autorelease pool이 마를 때까지 기다린 다음release라는 대상을 제거하고 균형 대상 인용 계수를 사용하여alloc,copy,new,mutable Copy를 제외한 함수 반환값에 적용할 수 있다.
두 번째는 함수 호출자가 Release 함수 반환 값을 책임지고 함수와 함수 호출자는 인용 계수를 유지하며 alloc,copy,new,mutableCopy와 같은 함수에 적용된다.

2. autorelease 실현에서의 최적화


1. 최적화된 장면
   우리가 하나의 대상을 되돌려주는 방법이 있다고 가정하면 방법 내부에서 우리retain이 이 대상을 되돌려주고 돌아올 때 우리는autorelease가 이 대상을 되돌려준다.호출자는 우리의 반환값 대상을 가져와서 즉시retain을 진행했고, 사용이 끝난 후에release를 진행했습니다.
2. 최적화된 사고방식
상기 장면에서 autorelease와 호출자의retain을 생략하면 문제가 발생하지 않습니다. 왜냐하면:
  • 반환값 대상의 대상이 작용역 경계를 안전하게 꿰뚫었다(release가 진행되지 않았기 때문).
  • 반환값 대상의 인용 계수는 균형적이다.

  • 3. 최적화된 실현
       컴파일러가 코드 분석을 통해 함수 반환 값이 즉각적인retain인지 판단하고 로고를 설정합니다.함수 반환 전의 autorelease와retain의 함수 반환 값은 objc_autoreleaseReturnValueobjc_retainAutoreleasedReturnValue 두 함수로 대체됩니다. 이 두 함수에서 이전에 설정한 로고에 따라 아무것도 하지 않을지, 진짜 autorelease와retain을 결정합니다.(과연 소프트웨어 공학에서 중간층을 늘려 해결할 수 없는 문제는 없다. 이곳의 autoRelease,retain은 중간층objc autorelease ReturnValue,objc retain Autoreleased ReturnValue로 대체된다. 이 두 가지 방법은 로고에 따라 동적화 순집을 집행한다)

    3. 왜 alloc,copy,new,mutableCopy 같은 방법은 autorelease가 아니라release의 책임을 호출자에게 맡깁니까?


    실행 효율, 메모리 사용 효율을 위해.대상을 autorelease pool에 넣는 것은 성능 비용이 있고 alloc 방법의 반환값도 autorelease라면 컴파일러와 실행 시 최적화가 없는 상황에서 모든 대상은 autorelease pool이 마를 때까지 기다려야 회수될 수 있다.함수가 되돌아오기 전에release가 아니면release의 책임을 호출자에게 이전하고 호출자는 되돌아오는 값을 사용한 후에 적시release 되돌아오는 값을 사용하여 메모리 사용 효율을 높일 수 있다.

    4. 왜 모든 방법이 alloc,copy,new,mutableCopy 같은 방법처럼 리액션의 책임을 호출자에게 맡기고 autorelease를 사용하지 않습니까?


       에는 두 가지 상황이 있는데,
  • 함수 내부retain이 되돌아오는 값을 가져왔습니다. 호출자가release를balance로 한 번 진행해야 합니다.
  • 함수 내부에retain 반환값이 없기 때문에 호출자가release를 한 번balance로 할 필요가 없습니다.(예를 들어 내가 되돌아온 클래스의 구성원 변수)
  •     문제는 함수가 호출자에게 블랙박스라고 하기 때문에 호출자는release의 함수 반환 값이 필요한지 확인할 수 없다는 것이다.한편,alloc,copy,new,mutableCopy 내부에 반드시 한 번의retain이 있을 것이다. (이 함수에서 당신이 retain이 없는 대상을 되돌려주면 시스템은retain 문장을 자동으로 추가한다) 따라서release를 한 번 진행해야 한다는 것을 확인하고release의 책임을 호출자에게 맡길 수 있다.
    전체적으로 말하자면release 책임을 호출자에게 맡기고 함수는 확정성을 가져야 한다.

    5. 모든 함수 반환값이 autorelease가 필요한 것은 아니다


    autorelease는 특수한release로 인용 계수를 1로 줄이는 작용도 한다.함수에retain이 없으면 autorelease가 필요하지 않습니다.예를 들어, 클래스property의 get 방법 반환 값은 autorelease가 필요하지 않고, 직접 반환하면 된다.
    - (SomeClass *)someInstance
    {
        return _someInstance;
    }

       물론, 필요하든 필요하지 않든 하나의 일이고, 다른 일이든 상관없다. 너는 필요하지 않은 일을 할 수 있다. 예를 들어 get 방법을 다음과 같이 실현할 수 있다.
    - (SomeClass *)someInstance
    {
        return [[someInstance retain] autorelease];
    }

       과 같은 결과는 대상의 속성의 생명 주기가 대상 자체보다 길 수 있다는 것이다.나는'속성은 대상에 속하고 생명주기는 대상의 인지에 의존한다'는 것에 부합되지 않는다고 생각한다.이렇게 get 방법을 실현하는 것은 지원되지 않습니다.

    좋은 웹페이지 즐겨찾기