문제

나는 새로운 메모리 관리 코드 그러나 나는 아이디어를 얻을 수 있습니다.

에 내 응용 프로그램을 통해 누구 XCode 에서 나타났만 했을 정리하는 내용,객체지 않는 동적으로 만들어진 배열의 예를 들어,그래서 나는 이러한 데이터 형식은 autoreleased-의미 난 이후에만 해제했다 배열으로 사용하는 속성이 있었(유지)니다.

그때 나는 뭔가 특:나는 누출에 배열 초기화는 다음과 같다:

NSMutableArray *removals = [NSMutableArray new];

하지만 비슷한

NSMutableArray *removals = [NSMutableArray arrayWithCapacity:9];

지금,그 이유는 하나의 설정과 함께"새로운"이 수 있는 0-99 항목이 그것에는 반면,다른 하나 되었을 항상 9.이후 두 배로 전달되는 동일한 방법에 따라 나중에 사용자 상호 작용,나는 하나 얻는 누설되지 않은 경우 릴리스의 끝에서,방법 또는 예외 경우았다!

을 변경했습니다 먼저 배열

NSMutableArray *removals = [NSMutableArray arrayWithCapacity:99];

나는 누출이 없을 출시니다.사?

도움이 되었습니까?

해결책

으로 주목에 메모리 관리 규칙, 때마다,당신은 개체는 당신이 가지고 만든 +alloc, +new, -copy, 나 -mutableCopy, 당신의 자신의 그것과에 대한 책임은 그것을 풀어 놓습니다.(사실, +new 은 속기 [[MyClass alloc] init].) 당신이 주목을 만들고,배열해 [NSArray new] 지 않고 그것을 풀어 놓이는 메모리 누수가 발생합니다.그러나 처리하는 경우 이 객체로,그것은 일반적으로 가능한 그것을 풀어 놓습니다.예를 들어:

  • 는 경우는 방법 배열이라고서 하는 방법을 배 만든 다음을 할 수 있어야 릴리스의 배열한 후에 사용 되었습니다.는 경우에는 내부 메서드를 유지해야기를 참조하여 배열,주위에 다음는 방법에 대한 책임이 보내기 -retain 그리고,결국 -release 을 개체입니다.예를 들어:

    - (void)myMethod {
        NSArray *removals = [NSArray new];
        // ...
        [someObject someOtherMethod:removals];
        [removals release];
    }
    
  • 을 만든 경우에 배열 -init 방법 당 개체에 대해 다음 -dealloc 방법 은 그것을 풀어 놓을 수 있을 때 물체가 파괴되었다.

  • 필요하신 경우에는 배열을 만들고 다음 return 에서 방법을 발견했는 이유는 autoreleasing 발명되었다.발신자의하는 방법에 대해 책임을 지지 않 해체 이후,그것은 아닙니다 +alloc, +new, -copy, 나 -mutableCopy 방법,하지만 당신은 그것을 지키는 것은 발표니다.이 경우에,당신은 당신 수동으로 통화 -autorelease 개체에 대한 당신이 그것을 돌려보내기 전에.예를 들어:

    - (NSArray *)myMethod {
        NSArray *removals = [NSArray new];
        // ...
        return [removals autorelease];
    }
    

을 만들 때를 통해 배열 +arrayWithCapacity:, 지 않습 중 하나를 호출하"특별한"방법,그래서 당신은하지 않 릴리스 결과입니다.이것은 아마 구현 -autorelease, 훨씬 지난 예를 들어,위의 그러나 꼭 그렇지 않습니다.(덧붙여 만들 수도 있습니다 빈 autoreleased NSMutableArray 과 [NSMutableArray array];이 방법은 찾을에 있기 때문입,그래서 그것은에서 보여지지 않습 문서에서 NSMutableArray 지만,그것이 만들어 가변 배열을 전송할 때 NSMutableArray 클래스입니다.) 려고하는 경우에 당신은 반환되는 array 에서 당신의 방법을 사용할 수 있습니다,이 속기 [[[NSMutableArray alloc] init] autorelease]—하지만 그것은 그냥 바로 가기입니다.많은 상황에서,하지만,개체를 만들 수 있습과 -init+new 과 수동으로 해제에서 적절한 시간입니다.

다른 팁

이것이 현장 뒤에서 구현 된 방식입니다.

+(NSMutableArray*) new
{
    return [[NSMutableArray alloc] init];
}

그리고

+(NSMutableArray*) arrayWithCapacity:(NSNumber)capacity
{
    return [[NSMutableArray alloc] initWithCapacity:capacity] **autorelease**];
}

첫 번째 경우 배열은 배정되며이를 탈취 할 책임이 있습니다. 반대로 ArraywithCapacity는 귀하를 위해 자동 고정되어 있으며 유출을 유발하지 않을 것입니다.

코코아는 특정 명명 규칙을 사용합니다. Alloc, New 또는 Copy로 시작하는 모든 것은 1의 고정 계산으로 무언가를 반환하면 릴리스해야합니다. 기능이 반환하는 다른 모든 것에는 균형 잡힌 retaincount가 있습니다 (다른 것에 의해 보관 될 수 있거나 유지 및 출시 될 수 있음).

그래서:

NSMutableArray *removals = [NSMutableArray new];

1의 고정 계산이 있습니다.

NSMutableArray *removals = [NSMutableArray arrayWithCapacity:99];

또는

NSMutableArray *removals = [NSMutableArray array];

메소드가 Alloc, New 또는 Copy로 접두사를 접두사하지 않으므로하지 마십시오. 이것은 모두 메모리 관리에서 설명됩니다 선적 서류 비치. 특히:

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

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