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을 생략하면 문제가 발생하지 않습니다. 왜냐하면:
3. 최적화된 실현
컴파일러가 코드 분석을 통해 함수 반환 값이 즉각적인retain인지 판단하고 로고를 설정합니다.함수 반환 전의 autorelease와retain의 함수 반환 값은
objc_autoreleaseReturnValue
와 objc_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를 사용하지 않습니까?
에는 두 가지 상황이 있는데,
전체적으로 말하자면release 책임을 호출자에게 맡기고 함수는 확정성을 가져야 한다.
5. 모든 함수 반환값이 autorelease가 필요한 것은 아니다
autorelease는 특수한release로 인용 계수를 1로 줄이는 작용도 한다.함수에retain이 없으면 autorelease가 필요하지 않습니다.예를 들어, 클래스property의 get 방법 반환 값은 autorelease가 필요하지 않고, 직접 반환하면 된다.
- (SomeClass *)someInstance
{
return _someInstance;
}
물론, 필요하든 필요하지 않든 하나의 일이고, 다른 일이든 상관없다. 너는 필요하지 않은 일을 할 수 있다. 예를 들어 get 방법을 다음과 같이 실현할 수 있다.
- (SomeClass *)someInstance
{
return [[someInstance retain] autorelease];
}
과 같은 결과는 대상의 속성의 생명 주기가 대상 자체보다 길 수 있다는 것이다.나는'속성은 대상에 속하고 생명주기는 대상의 인지에 의존한다'는 것에 부합되지 않는다고 생각한다.이렇게 get 방법을 실현하는 것은 지원되지 않습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
View의 레이아웃 방법을 AutoLayout에서 따뜻한 손 계산으로 하면 성능이 9.26배로 된 이야기이 기사는 의 15 일째 기사입니다. 어제는 에서 이었습니다. 손 계산을 권하는 의도는 없고, 특수한 상황하에서 계측한 내용입니다 화면 높이의 10 배 정도의 contentView가있는 UIScrollView 레이아...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.