문제

다음은 제가 쓰고있는 일부 코드의 요지입니다. NSMutableArray의 배열 클래스 메소드의 유지/릴리스 문제를 제대로 다루지 않을까 걱정됩니다. 다음은 실제로 메모리를 새는 것입니까?

for(a while) { 
    // do stuff
    NSMutableArray *a = nil;
    // do stuff
    if (!a) {
        a = [NSMutableArray array];
    }
} // for(a while)
도움이 되었습니까?

해결책

이 코드에서 메모리가 누출되지 않으며, 배열이 런 루프 끝에서 배열이 자동으로 표시되면 충돌이 발생합니다.

대부분의 코코아 수업은 새로운 대상을 만드는 몇 가지 방법을 제공 하며이 컨벤션과 매우 일치합니다.

  1. [[NSSomeObject alloc] init] : 객체를 공개 할 책임이 있습니다 (인스턴스 메소드).

  2. [NSSomeObject someObject] : 객체는 일반적으로 실행 루프 (클래스 메소드)의 끝에서 자동으로 설정됩니다. 대략 동일합니다 [[[NSSomeObject alloc] init] autorelease].

인스턴스 방법의 올바른 사용은 다음과 같습니다.

a = [[NSMutableArray alloc] init];
// do stuff
[a release];

클래스 방법의 올바른 사용은 다음과 같습니다.

a = [NSMutableArray array];
// do stuff, array is in the autorelease pool

Apple은 성능을 향상시키기 위해 가능한 한 편의 방법을 멀리 할 것을 권장했습니다. 이것은 논쟁의 여지가있는 조언, 프로세서 시간이 많이 절약되지 않을 수 있으며, 실제로 보관하는 것에 관심이 없을 수도있는 객체의 릴리스에서 Alloc-Init을 분리합니다.

다른 팁

로부터 코코아 메모리 관리 규칙:

이름이 "Alloc"또는 "New"로 시작하거나 "Copy"(예 : Alloc, NewObject 또는 MutableCopy)를 포함하는 메소드를 사용하여 객체의 소유권을 얻거나 메시지를 보내는 경우 객체를 작성하는 경우 객체의 소유권을 얻습니다. 귀하는 릴리스 또는 자동 제출을 사용하여 소유 한 객체의 소유권을 포기해야합니다. 다른 시간에 당신은 객체를받을 때마다 그것을 해제해서는 안됩니다.

따라서 라인과 함께 :

a = [NSMutableArray array];

당신은 배열의 소유권을 가지지 않으며, 당신에게 자동으로 전달됩니다. 메모리는 AutorELEASE 풀에서 자동으로 처리되며 더 이상 사용되지 않으면 해제됩니다. 그러나 배열을 현재 이벤트 밖에서 유지하려면 유지해야합니다. 그렇지 않으면 릴리스됩니다.

예, 당신이 그것을 고수하고 싶다면.

반환 된 객체는 자동 제국 풀이 정화 될 때 거래 될 수있는 자동 저리 객체입니다.

"배열"으로 시작하는 모든 배열 클래스 메소드는 이러한 유형의 자동 엘리트 객체를 반환합니다.

이것을 읽으십시오 문서 Apple에 의해.

유효합니다. 질문이 있거나 배우는 데 수동으로 물건을 관리하는 데 도움이 될 수 있습니다.

컨벤션이 있습니다.

  • 시작 접두사 (init, initwithstring :) 1의 유지 수를 나타냅니다.
  • ObjectName Prefixes (String, StringwithString :) autoreLed 객체를 나타냅니다.

나는 몇 년 동안 콜 사이트에서 할 수있는 것을 자동으로 엘리브로 제공하기보다는 습관을 공개하는 습관을 가졌습니다. 그런 다음 일부 자동 제출 문제는 추적하기가 어려워집니다. 물론, AutorELEASE는이 경우 프로그래머에게 편의성이지만 (아무것도 잘못된 것이면) 재사용, 선명도 및 성능 (대형 코드베이스/프로그램의 Moreso)에 부정적인 영향을 미칩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top