下面关于Objective-C内存管理的描述错误的是 A 当使用ARC来管理内存时,代码中不可以出现autorelease B autoreleasepool 在 drain 的时候会释放在其中分配的对象 C 当使用ARC来管理内存时,在线程中大量分配对象而不用autoreleasepool则可能会造成内存泄露 D 在使用ARC的项目中不能使用NSZone
A의 실수는 ARC를 사용할 때 컴파일러가 자동 릴리스 사용을 금지하고, 유지 및 릴리스와 마찬가지로 컴파일러가 자동 릴리스 추가를 도와준다는 것입니다. 하지만 __autoreleasing을 사용하여 변수를 지정하고 이를 autoreleasepool에 추가할 수 있습니다
C의 설명이 맞습니다. autoreleasepool을 사용하면 많은 수의 객체를 생성해야 할 때 객체 릴리스 속도를 높일 수 있습니다. A가 틀리면 질문 작성자가 당신을 테스트하고 싶어한다는 의미일 뿐입니다. 실제로 ARC의 원칙은 컴파일러가 자동으로 코드에 자동 릴리스 및 기타 코드를 추가한다는 것입니다. 실제로 ARC 프로젝트에서 자동 릴리스를 작성하면 컴파일도 불가능합니다. 이렇게 생각하면 실제로 A가 맞습니다. 근데 나머지 3개는 맞으니까 A만 고를 수 있겠네요.
==========업데이트========== 내 답변을 싫어하는 분들이 내 답변의 댓글란에 무엇이 잘못되었는지 알려주셨으면 좋겠습니다. A가 왜 틀렸는지 대충 짐작만 했는데도 포스터 C가 맞다고 분명히 대답했습니다. C가 올바른 이유는 공식 문서인 autoreleasepool을 참조하세요.
보조 스레드를 생성하는 경우. 스레드가 실행되기 시작하자마자 자체 자동 릴리스 풀 블록을 생성해야 합니다. 그렇지 않으면 애플리케이션에서 객체가 누출됩니다. 자세한 내용은 자동 릴리스 풀 블록 및 스레드를 참조하세요. )
==========다시 업데이트========== 위 문서는 MRC에 관한 내용으로, 대량의 객체를 생성하기 위해 autorelease pool이 필요한지 알 수 있습니다. ARC 스레드에 이 답변이 있습니다: http://stackoverflow.com/ques...
A와 D는 기본적으로 동일하지만 사실 NSZone *zone = NSDefaultMallocZone(); 이 코드는 컴파일해서 실행할 수 있습니다.
읽으신 참고 답변이 잘못되었습니다. ARC에서는 프로그래밍에 자동 릴리스를 사용할 수 없지만 @autoreleasepool을 사용할 수 있습니다. 그 기능은 메모리 사용량을 줄이는 것입니다.
으아아아
다음 내용은 주로 @ChickenBoy의 "Cocoa 애플리케이션의 각 스레드는 자체 자동 릴리스 풀 블록 스택을 유지 관리합니다. 다른 스레드에서는 자동 릴리스 풀을 직접 생성해야 합니다. 그렇지 않으면 자동으로 생성되지 않습니다"에 대한 답변입니다. 해제되고 메모리 누수가 발생합니다."
Cocoa 애플리케이션의 각 스레드는 자체 자동 릴리스 풀 블록 스택을 유지합니다. 이 문장에서는 "Cocoa 애플리케이션의 각 스레드가 자체 자동 릴리스 풀 블록 스택을 유지합니다"라는 한 가지 사실만 설명합니다. Foundation 전용 프로그램을 작성하거나 스레드를 분리하는 경우 자체 자동 릴리스 풀 블록을 생성해야 합니다. Foundation 전용 애플리케이션을 작성 중이거나 스레드를 분리하는 경우 자체 자동 릴리스 풀 블록을 생성해야 합니다. . 풀 블록을 해제합니다.
애플리케이션이나 스레드가 수명이 길고 잠재적으로 자동 릴리스된 객체를 많이 생성하는 경우 자동 릴리스 풀 블록을 사용해야 합니다(메인 스레드에서 AppKit 및 UIKit이 수행하는 것처럼). 그렇지 않으면 자동 릴리스된 객체가 누적되어 메모리 공간이 늘어납니다. 분리된 스레드가 Cocoa 호출을 수행하지 않는 경우 자동 릴리스 풀 블록을 사용할 필요가 없습니다. 애플리케이션이나 스레드가 오랫동안 유지되고 많은 수의 자동 릴리스 개체를 생성할 수 있는 경우 자동으로 풀을 자동 릴리스해야 합니다. 그렇지 않으면 자동 해제된 객체가 누적되어 메모리를 차지하게 됩니다. 생성한 스레드가 Cacoa를 호출하지 않는 경우에는 자동 릴리스 풀 블록을 사용할 필요가 없습니다.
ARC는 iOS 런타임 기능이나 다른 언어의 가비지 수집기가 아닌 컴파일러 기능이기 때문입니다. 즉, 컴파일 타임에 결정되는 메모리 관리만 처리할 수 있으며 사용되는 메커니즘은 참조 카운팅입니다. 즉, 메모리 해제가 필수는 아닙니다. 예를 들어 상호 메모리 참조, 동적 참조 등은 참조 횟수가 즉시 0으로 설정되지 않으므로 이때 명시적인 해제가 필요합니다.
A의 실수는 ARC를 사용할 때 컴파일러가 자동 릴리스 사용을 금지하고, 유지 및 릴리스와 마찬가지로 컴파일러가 자동 릴리스 추가를 도와준다는 것입니다. 하지만 __autoreleasing을 사용하여 변수를 지정하고 이를 autoreleasepool에 추가할 수 있습니다
C의 설명이 맞습니다. autoreleasepool을 사용하면 많은 수의 객체를 생성해야 할 때 객체 릴리스 속도를 높일 수 있습니다.
A가 틀리면 질문 작성자가 당신을 테스트하고 싶어한다는 의미일 뿐입니다. 실제로 ARC의 원칙은 컴파일러가 자동으로 코드에 자동 릴리스 및 기타 코드를 추가한다는 것입니다. 실제로 ARC 프로젝트에서 자동 릴리스를 작성하면 컴파일도 불가능합니다. 이렇게 생각하면 실제로 A가 맞습니다.
근데 나머지 3개는 맞으니까 A만 고를 수 있겠네요.
==========업데이트==========
내 답변을 싫어하는 분들이 내 답변의 댓글란에 무엇이 잘못되었는지 알려주셨으면 좋겠습니다.
A가 왜 틀렸는지 대충 짐작만 했는데도 포스터 C가 맞다고 분명히 대답했습니다.
C가 올바른 이유는 공식 문서인 autoreleasepool을 참조하세요.
==========다시 업데이트==========
위 문서는 MRC에 관한 내용으로, 대량의 객체를 생성하기 위해 autorelease pool이 필요한지 알 수 있습니다. ARC 스레드에 이 답변이 있습니다:
http://stackoverflow.com/ques...
A와 D는 기본적으로 동일하지만 사실
NSZone *zone = NSDefaultMallocZone();
이 코드는 컴파일해서 실행할 수 있습니다.
읽으신 참고 답변이 잘못되었습니다.
으아아아ARC에서는 프로그래밍에 자동 릴리스를 사용할 수 없지만
@autoreleasepool
을 사용할 수 있습니다. 그 기능은 메모리 사용량을 줄이는 것입니다.Cocoa 애플리케이션의 각 스레드는 자체 자동 릴리스 풀 블록 스택을 유지합니다.
이 문장에서는 "Cocoa 애플리케이션의 각 스레드가 자체 자동 릴리스 풀 블록 스택을 유지합니다"라는 한 가지 사실만 설명합니다.
Foundation 전용 프로그램을 작성하거나 스레드를 분리하는 경우 자체 자동 릴리스 풀 블록을 생성해야 합니다.
Foundation 전용 애플리케이션을 작성 중이거나 스레드를 분리하는 경우 자체 자동 릴리스 풀 블록을 생성해야 합니다. . 풀 블록을 해제합니다.
애플리케이션이나 스레드가 수명이 길고 잠재적으로 자동 릴리스된 객체를 많이 생성하는 경우 자동 릴리스 풀 블록을 사용해야 합니다(메인 스레드에서 AppKit 및 UIKit이 수행하는 것처럼). 그렇지 않으면 자동 릴리스된 객체가 누적되어 메모리 공간이 늘어납니다. 분리된 스레드가 Cocoa 호출을 수행하지 않는 경우 자동 릴리스 풀 블록을 사용할 필요가 없습니다.
애플리케이션이나 스레드가 오랫동안 유지되고 많은 수의 자동 릴리스 개체를 생성할 수 있는 경우 자동으로 풀을 자동 릴리스해야 합니다. 그렇지 않으면 자동 해제된 객체가 누적되어 메모리를 차지하게 됩니다.
생성한 스레드가 Cacoa를 호출하지 않는 경우에는 자동 릴리스 풀 블록을 사용할 필요가 없습니다.
새 스레드를 직접 생성할 때 내부 메모리를 관리해야 합니다. 메인 스레드의 runloop에서만 autoreleasePush() 및 autoreleasePop()이 자동으로 추가됩니다.
ARC는 iOS 런타임 기능이나 다른 언어의 가비지 수집기가 아닌 컴파일러 기능이기 때문입니다.
즉, 컴파일 타임에 결정되는 메모리 관리만 처리할 수 있으며 사용되는 메커니즘은 참조 카운팅입니다.
즉, 메모리 해제가 필수는 아닙니다. 예를 들어 상호 메모리 참조, 동적 참조 등은 참조 횟수가 즉시 0으로 설정되지 않으므로 이때 명시적인 해제가 필요합니다.