2012-10-03 2 views
2

Objective-c 및 메서드 호출에서 메모리 관리에 관한 아주 간단한 질문이 있습니다.메서드 호출을 통한 메모리 관리

- (void)someFunction 
{ 
    NSMutableArray *array = [NSMutableArray arrayWithObjects:@"Value 1", nil]; 
    [self someOtherFunction:array]; 
} 

- (void)someOtherFunction:(NSMutableArray *)array 
{ 
    // Should I retain array here? 
    [array addObject:@"Value 2"]; 
    // And then release ? 
} 

이 간단한 exemple하지만 10 방법은 같은 객체 매개 변수로 호출처럼 우리가 상상 :

내가 가지고 상상해보십시오. 가장 좋은 솔루션은 무엇입니까?

+0

문제는 무엇인가? – trojanfoe

+0

ARC를 사용하고 있습니까? – kennytm

+0

@trojanfoe 내 코드에서 내 주석을 읽으십시오 :) 아니요 ARC를 사용하고 있지 않습니다. – Pierre

답변

1

이있는 경우 모든 벨트 앤 중괄호 또는 스레드와 함께 이상한 일을 많이하고있다 그리고 나서 당신은 아마/각 메서드 호출 내부에 릴리스해야합니다. 사실 ARC가 당신을 위해 무대 뒤에서하는 일입니다. (내가 아는 한 문서화 된 것은 아니며 버전마다 다를 수 있습니다.)

그리고 확실히, 제안한대로 유지/해제하는 데 아무런 해가 없습니다. 실제로는 많은 오버 헤드를 추가하지 않을 것입니다.

대부분의 사람들이 말하길 : 대부분의 사람들 에 보존/릴리스를 추가하지 않았습니다. 코드가 모두 주 스레드에서 실행되는 경우 메서드를 실행하는 동안 개체가 릴리스되지 않을 가능성이 높습니다.

0

편의 생성자를 사용 retured 개체 오토 릴리즈 개체로 리턴되고 (이 ARC가 비활성화되는 경우에 참조 카운팅을 설명).

Autorelease는 현재 runloop의 끝에서 개체의 참조 횟수가 1 씩 감소한다는 것을 의미합니다. 개체가 생성 시점에서이 시점까지 유지되지 않으면 개체가 할당 취소됨을 의미합니다.

즉, 코드에서 someFunction 메서드가 끝날 때까지 객체가 유지되므로 retain/release 호출을 추가 할 필요가 없습니다.

당신은 예를 들어, 인스턴스 변수, 배열 생활을 유지하셔야합니다 someFunction 방법의 말 경우, 사용을 유지할 수 있습니다

_myInstanceVar = [array retain]; // don't forget to release it in dealloc method