2011-10-26 2 views
0

샘플 코드를 사용해야합니까 :버전은 객체를 반환하거나 내가 오토 릴리즈

- (Foo*)createFoo { 
    Foo *foo = [[Foo alloc] init]; 
    return foo; 
} 

- (void)someOtherMethod { 
    Foo *foo; 
    foo = [self createFoo]; //retain count 1 
    [foo release]; //retain count = 0 => object gets released? 

    //repeat 
    foo = [self createFoo]; 
    [foo release]; 
} 

Qeustion (어쩌면 바보 하나) : 내가 createFoo에 autorelease를해야하거나 내가 someOtherMethod에서 반환 된 객체를 해제 할 수 있습니까?

+0

나는 [self createFoo]가 아니라 [self Foo]를 호출한다고 가정하고, someOtherMethod에서 해제하는 것이 좋습니다. 그냥 ARC는 거의 모든 문제를 없애 버리겠습니다. –

+1

@ilMalvagioDottorProsciutto ARC 주석에 동의하는 동안 ARC가 단순히이 호출을 넣는 것 외에도 수동으로 수행해야하는 방법에 대한 지식이있는 것이 좋습니다. 어쨌든, 그것이 무엇을하는지 알면 아주 좋습니다. –

+0

@ SimonLee 정확하게 내 생각 – peko

답변

0

코드에서 소유권을 양도 할 때이 인스턴스의 코드가 개체를 자동 갱신해야하므로 더 이상 메서드 내에서 해당 코드에 대한 책임을지지 않으므로 해당 코드를 보관해야합니다.

것은 밀고 자 기억 - autorelease를하지 가정이 키워드로 시작하는 방법 ...

당신의 방법이 newFoo 또는 copyFoo 선정 된 경우 새로운, ALLOC, 보관, 복사

그런 다음 위의 코드는 것 autoreleasing없이 괜찮아.

+0

그래서 아무것도 잘못 될 것입니다 및 newFoo에 다음과 같은 사과 코드 요구 사항 createFoo 이름을 바꾸면? – peko

+0

예, 괜찮습니다. 그렇지 않으면 autorelease를 호출 한 다음 호출 코드에 그대로두고 완료되면 놓으십시오. –

0

코코아 메모리 관리는 실제로 모든 사람이 일련의 규칙을 고수하기 때문에 매우 쉽습니다. 당신은 그 규칙을 따르지 않으므로, 당신은 곤경에 처하게 될 것입니다.

Basic Memory Management Rules을 읽으십시오. 당신이 그 규칙을 따르는 것으로 고집한다면, 당신은 잘되어야합니다.

관련 문제