Objective-C의 자동 기준 계수가 방지하거나 최소화하지 못하는 누출의 종류는 무엇입니까?
Mac 및 iOS 플랫폼에서 메모리 누수는 종종 출시되지 않은 포인터로 인해 발생합니다.기존에는 할당, 복사 및 유지를 확인하여 각각에 대응하는 릴리스 메시지가 있는지 확인하는 것이 항상 가장 중요했습니다.
Xcode 4.2에 부속되어 있는 툴 체인에서는 최신 버전의 LLVM 컴파일러에 자동 참조 카운트(ARC)가 도입되어 컴파일러가 사용자의 데이터를 메모리 관리함으로써 이 문제를 완전히 해소합니다.이 기능은 매우 훌륭합니다.또한 불필요한 일상적인 개발 시간을 대폭 단축하고 적절한 유지/해제 밸런스로 쉽게 수정할 수 있는 부주의한 메모리 누수를 방지합니다.Mac 및 iOS 앱에서 ARC를 활성화하면 자동 리스 풀도 다르게 관리해야 합니다(자체 할당은 필요 없음).NSAutoreleasePool
s)아니다.
하지만 또 어떤 메모리 누수가 제가 여전히 조심해야 하는 것을 막지 않나요?
보너스로 Mac OS X의 ARC와 iOS, Mac OS X의 가비지 컬렉션의 차이점은 무엇입니까?
메모리와 관련된 주요 문제는 유지 사이클입니다.이 문제는 한 개체에 다른 개체에 대한 강력한 포인터가 있지만 대상 개체에 원래 개체로 돌아가는 강력한 포인터가 있는 경우에 발생합니다.이러한 오브젝트에 대한 다른 참조가 모두 삭제되어도 이들 오브젝트는 서로 고정되며 해제되지 않습니다.이것은, 체인내의 마지막 것이 이전의 오브젝트를 참조하고 있을 가능성이 있는 오브젝트 체인에 의해서도 간접적으로 발생할 수 있습니다.
때문에 '이것'은__unsafe_unretained
★★★★★★★★★★★★★★★★★」__weak
이치노전자는 가리키는 오브젝트를 유지하지 않고 오브젝트가 없어질 가능성을 열어두고 나쁜 메모리를 가리키고 있는 반면 후자는 오브젝트를 유지하지 않고 타깃이 할당 해제되면 자동으로 0으로 설정됩니다.중에 둘중 of of of of__weak
는 일반적으로 이를 지원하는 플랫폼에서 선호됩니다.
이러한 수식자는 딜러와 같이 개체가 딜러를 유지하여 잠재적으로 사이클로 이어지지 않도록 하는 경우에 사용합니다.
또 관련 및 입니다.이러한 오브젝트는 핵심 오브젝트 및 하여 할당되어 있습니다.malloc()
같은 타입의 경우char*
ARC는 이러한 유형을 관리하지 않고 Objective-C 객체만 관리하므로 사용자가 직접 처리해야 합니다.코어 Foundation 타입은 특히 까다로울 수 있습니다.이는 일치하는 Objective-C 오브젝트에 브리지해야 하거나 그 반대일 수 있기 때문입니다.즉, CF 타입과 Objective-C를 브리징할 때는 ARC에서 앞뒤로 제어를 전송해야 합니다.이 브리징과 관련된 키워드가 몇 가지 추가되어 있습니다.Mike Ash는 장황한 ARC 기사에서 다양한 브리징 케이스에 대해 설명하고 있습니다.
이 외에도 빈도는 낮지만 문제가 될 수 있는 경우가 몇 가지 있는데, 공개된 사양에 대해 자세히 설명합니다.
강력한 포인터가 있는 한 오브젝트를 주위에 유지하는 것을 기반으로 하는 새로운 동작의 대부분은 Mac에서의 가비지 컬렉션과 매우 유사합니다.그러나 기술적 토대는 매우 다르다.가비지 콜렉터 프로세스가 정기적으로 실행되어 더 이상 지적되지 않는 오브젝트를 정리하는 것이 아니라 이 메모리 관리 스타일은 Objective-C에서 모두가 준수해야 하는 엄격한 유지/릴리스 규칙에 의존합니다.
ARC는 몇 년 동안 반복적인 메모리 관리 작업을 컴파일러에 오프로드하기만 하면 되기 때문에 더 이상 걱정할 필요가 없습니다.이렇게 하면 가비지 수집 플랫폼에서 발생하는 중단 문제나 톱니 메모리 프로파일이 발생하지 않습니다.가비지 수집 Mac 애플리케이션에서 이 두 가지를 모두 경험한 적이 있으며, ARC에서 어떤 동작을 하는지 매우 알고 싶습니다.
가비지 수집에 대한 자세한 내용은ARC, Chris Ratner가 Objective-C 메일링 목록에서 작성한 매우 흥미로운 응답을 참조하십시오. 이 목록에는 ARC가 Objective-C 2.0 가비지 컬렉션에 비해 갖는 많은 이점이 나와 있습니다.나는 그가 설명한 GC 문제들 중 몇 가지에 부딪쳤다.
이외의 메모리에는 를 들어 ARC ObjC를 사용하는 ).★★★★★★★★★★★★★★★★★,malloc()
돼, 해야 돼요.free()
바로 그거에요.
ARC는 다음과 같이 속일 수 있습니다.performSelector:
컴파일러가 셀렉터를 특정할 수 없는 경우(컴파일러는 이에 대한 경고를 생성합니다).
ARC는 또한 ObjC 명명 규칙에 따라 코드를 생성하므로 ARC 코드와 MRC 코드를 혼합하면 MRC 코드가 컴파일러가 약속하는 대로 실행되지 않으면 놀라운 결과를 얻을 수 있습니다.
다음 4가지 문제로 인해 응용 프로그램에서 메모리 누수가 발생했습니다.
- 뷰 컨트롤러를 해제할 때 NSTimer를 비활성화하지 않음
- 뷰 컨트롤러를 해제할 때 NSNotificationCenter에서 관찰자를 제거하지 않았습니다.
- 자기 자신에 대한 강한 참조를 블록 단위로 유지합니다.
- 컨트롤러 속성 보기에서 딜러에 대한 강력한 참조 사용
다행히 다음 블로그 투고를 발견하고 수정할 수 있었습니다.http://www.reigndesign.com/blog/debugging-retain-cycles-in-objective-c-four-likely-culprits/
또한 ARC는 Core Foundation 유형을 관리하지 않습니다.이들을 '브릿지'할 수 있다(사용방법)CFBridgingRelease()
Objective-C/Cocoa 오브젝트로 사용하는 경우에만 해당됩니다.CFBridging Release는 Core Foundation 보유 카운트를 1씩 줄이고 Objective-C의 ARC로 이동합니다.
Xcode 9는 이러한 문제를 찾기 위한 훌륭한 도구입니다.이것은 "디버깅 메모리 그래프"라고 불립니다.이를 사용하면 클래스 유형별로 유출된 물체를 찾을 수 있으며, 유출된 물체를 해제함으로써 누가 강력한 참조를 가지고 있는지 명확하게 알 수 있습니다.또, 메모리 사이클도 검출됩니다.
언급URL : https://stackoverflow.com/questions/6260256/what-kind-of-leaks-does-automatic-reference-counting-in-objective-c-not-prevent
'source' 카테고리의 다른 글
현재 날짜에서 7일 빼기 (0) | 2023.04.12 |
---|---|
WPF MVVM 탐색 뷰 (0) | 2023.04.12 |
Python 목록의 True Bohan 수 계산 (0) | 2023.04.12 |
Excel VBA 함수 결과 새로 고침 (0) | 2023.04.12 |
SQL Server 문자열과 Null 연결 (0) | 2023.04.12 |