ios - Objective-C内存管理面试题一道
大家讲道理
大家讲道理 2017-04-18 09:49:28
0
5
505

下面关于Objective-C内存管理的描述错误的是
A 当使用ARC来管理内存时,代码中不可以出现autorelease
B autoreleasepool 在 drain 的时候会释放在其中分配的对象
C 当使用ARC来管理内存时,在线程中大量分配对象而不用autoreleasepool则可能会造成内存泄露
D 在使用ARC的项目中不能使用NSZone

= =。。
网上看到的,参考答案为A.

我觉得选C来的~

不知道A错在哪里了?

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

모든 응답(5)
巴扎黑

A의 실수는 ARC를 사용할 때 컴파일러가 자동 릴리스 사용을 금지하고, 유지 및 릴리스와 마찬가지로 컴파일러가 자동 릴리스 추가를 도와준다는 것입니다. 하지만 __autoreleasing을 사용하여 변수를 지정하고 이를 autoreleasepool에 추가할 수 있습니다

PHPzhong

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를 호출하지 않는 경우에는 자동 릴리스 풀 블록을 사용할 필요가 없습니다.

阿神

새 스레드를 직접 생성할 때 내부 메모리를 관리해야 합니다. 메인 스레드의 runloop에서만 autoreleasePush() 및 autoreleasePop()이 자동으로 추가됩니다.

巴扎黑

ARC는 iOS 런타임 기능이나 다른 언어의 가비지 수집기가 아닌 컴파일러 기능이기 때문입니다.
즉, 컴파일 타임에 결정되는 메모리 관리만 처리할 수 있으며 사용되는 메커니즘은 참조 카운팅입니다.
즉, 메모리 해제가 필수는 아닙니다. 예를 들어 상호 메모리 참조, 동적 참조 등은 참조 횟수가 즉시 0으로 설정되지 않으므로 이때 명시적인 해제가 필요합니다.

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿