2013-07-21 1 views
0

Obj-C를 처음 접했을 뿐이고, 더 이상 쓸데없는 프로그램을 만들어 내 지식을 향상시킬 수 없습니다. 내가 어떤 메모리 누수도하지 않았는지 확인하고 싶었다. '@autoreleasepool'에있는 프로그램이 종료되면 자동으로 메모리를 해제합니까?Objective-C @autoreleasepool?

또한 나쁜 습관이있는 경우 알려 주시기 바랍니다.

int main(int argc, const char * argv[]) 
{ 
    @autoreleasepool { 

     Fraction* fractionOne = [[Fraction alloc]init]; 
     Fraction* fractionTwo = [[Fraction alloc]init]; 
     Fraction* fractionThree = [[Fraction alloc]init]; 

     [fractionOne setTo:1 over:2]; 
     [fractionTwo setTo:1 over:4]; 
     [fractionThree setTo:1 over:8]; 

     [Fraction numberOfFractions]; 

    return 0; 
    } 
} 

답변

0

그 이상입니다. 하지만 걱정하지 마십시오. ARC에만 의존하십시오. 그것은 당신을 위해 당신의 기억을 관리합니다!

ARC를 사용하면 실제로 볼 수있는 유일한 장소는 @autoreleasepool입니다. 앱을 만들기 시작할 때 다른 곳에서 코드를 작성하고 "기본"주 기능 (Xcode 템플릿으로 제공)을 간신히 편집합니다.

걱정하지 마세요. 귀하의 코드는 괜찮습니다 :)

+1

Nah, 클래스 메서드를 만들기 위해 만든 방법 일뿐입니다. 분수 오브젝트의 수를 기록합니다. 응답 주셔서 감사합니다! – user2350763

+0

ARC는 "메모리를 관리하지 않습니다"라고 생각하고 메모리 누수/충돌을 디버그하기 어려울 것으로 생각합니다. –

+0

당신이 관리하는 정도는 "= nil"(그리고 일반적으로 메모리에 대해 생각하는 것)을 사용하는 것이지만, 나는 당신이 메모리를 명시 적으로 할당 해제 할 수 없다는 것을 의미했다. 초심자는 기억에 관하여 너무 많이 고민하지 않아야합니다. 앱을 만들기 시작할 때 강한/약한 속성 참조를 할 것인지 걱정해야합니다. 나는 ARC에게 그 일을 시키도록 시켰고, 지금까지 아무런 문제가 없었다. – Macro206

0

ARC를 켜면 명시 적으로 분수 1, 2 및 3을 릴리스하기 위해 컴파일 타임에 코드가 추가되어 ARC로 해제됩니다. ARC가 없다면, alloc은 Fraction의 유지 된 인스턴스를 생성하고 코드는 명시 적으로 (거의 항상 더 좋게) 공개하지 않거나 autoreleased (거의 항상 악화)로 설정하지 않습니다.

호가 없으므로이 프로그램이 실행되는 몇 밀리 초 동안 누출이 발생합니다.

+0

그래, @autoreleasepool은 ARC를 켠 상태에서만 사용할 수 있습니까? 내가 그것을 가지고 있지 않다고 가정 할 때, 나는 어떻게 그 기억을 할당 해제하겠습니까? ARC가 켜져 있어도 할당을 해제해도 괜찮습니까? – user2350763

+1

ARC가 코드를 처리 할 때 많이 사용하지는 않았지만 선언 한대로 작동합니다. ARC를 켜면 명시 적으로 릴리스하지 않습니다. 컴파일러는 당신을 내버려 두지 않을 것입니다. – danh

3

고급 메모리 관리 프로그래밍 가이드의 Using Autorelease Pool Blocks에 대한 Apple의 설명을 참조하십시오. 요컨대

은없고, 그것 (또는 적어도 아닌 @autoreleasepool의 함수로서)의 " @autoreleasepool 아무것도 자동 프로그램이 종료 [S]는 메모리를 해제"는 그렇지 않다. autorelease 풀을 갖는 목적은 autorelease 항목에서 메모리를 회수 할 때, 즉 풀을 언제 비울지를 제어하는 ​​것입니다. 그러나 코드 샘플은 자동으로 릴리즈 된 아이템을 사용하지 않는 것으로 보이므로 여기서는 실제로 적용 할 수 없습니다 (메소드가 내부에서 자동 릴리즈 오브젝트를 사용하지 않는 한).

autorelease 풀의 가장 일반적인 용도는 앱의 최고 수위 표시 메모리를 줄이는 것입니다. Use Local Autorelease Pool Blocks to Reduce Peak Memory Footprint을 참조하십시오. 예전에는 used for thread programming 이었지만 이제는 연산 및 디스패치 블록이 생겼으므로 기존 스레드 코드를 더 이상 작성할 필요가 없으므로 다중 스레드 코드에서 별도의 자동 풀 풀이 필요하지 않습니다.