2011-11-08 2 views
1

내 질문에 이미 StackOverflow에서 논의 된 것을 알고 있지만 내 요구 사항에 대한 대답이 완전하지 않음을 알게되었습니다. 질문은 다음과 같습니다.개체를 복사하는 동안 메모리 관리

NSMutableArray *firstArray = [[NSMutableArray alloc] initWithObjects: obj1,obj2,nil]; 
NSMutableArray *secondArray = [[NSMutableArray alloc] init]; 
secondArray = [firstArray mutableCopy]; 

이제 secondArray의 보유 개수는 무엇입니까? 2 또는 1? 나는 그것을 두 번이나 한 번 공개해야합니까? copy 또는 mutableCopy가 COPYING (이 이벤트의 secondArray) 객체의 보유 수를 늘리나요?

답변

5

절대 보유 횟수에 신경 쓰지 않아야합니다. 단지 "균형 잡힌"즉, 모든 alloc, new*, copy, mutableCopyretain을 의미합니다. 해당 release 또는 autorelease (ARC를 사용하지 않는 경우)이 필요합니다.

이 규칙을 각 행에 적용하면 두 번째 행에 alloc이 있지만 릴리스가없는 것을 볼 수 있습니다. 사실, 어쨌든 여기에 관심이 없으므로 여기에 인스턴스를 할당하는 것은 절대적으로 쓸모가 없습니다.

NSMutableArray *firstArray = [[NSMutableArray alloc] initWithObjects: obj1,obj2,nil]; 
NSMutableArray *secondArray = [firstArray mutableCopy]; 
// There is no third line. 

를하지만의 원래 코드를 논의하고 무슨 일이 있었는지 보자 : 그래서 단순히 읽어야

목표 - C에서
NSMutableArray *firstArray = [[NSMutableArray alloc] initWithObjects: obj1,obj2,nil]; 
NSMutableArray *secondArray = [[NSMutableArray alloc] init]; 
// secondArray points to a new instance of type NSMutableArray 
secondArray = [firstArray mutableCopy]; 
// You have copied another array (created a new NSMutableArray 
// instance) and have overwritten the pointer to the old array. 
// This means that the instance allocated in line 2 is still there 
// (was not released) but you don't have a pointer to it any more. 
// The array from line 2 has been leaked. 

, 우리는 종종 소유권 이야기 : 거의 방법이 있다는 것을 당신에게 객체의 "소유자"를 만들어라. 이들은 : 같이

  • alloc
  • new*

      , 당신이이를 호출 할 경우, 당신은 당신이 책임입니다있는 개체를 얻을
    • retain

    newFoo

  • copymutableCopy . 즉, release 및/또는 autorelease이라는 해당 번호로 전화해야합니다. 당신이 [[obj retain] retain];을 다음 [[obj autorelease] release];

  • +0

    나는 소유하고 있으며 어떤 단계에서 공개해야하는 두 개의 개체가 있다고 덧붙입니다. 그리고 당신 말이 맞아요. - retainCount는 유일합니다. 소유 전화와 전화를 끊는 것에 대해서만 걱정할뿐입니다. – Abizern

    +0

    실제로 secondArray가 코드에서 멀리 떨어져 할당되어 사용되었습니다. 편의를 위해 두 번째 줄에 썼습니다.그래서 내가 메모리 누수를 피하기 위해 당신을 바로 잡았다면, 먼저 secondArray를 릴리즈해야하며 이것이 절대적으로 유효할까요? –

    +0

    @AndreyChernukha : 일단 완료되면'secondArray'가 가리키는 객체 만 놓습니다. 'release '는 다음을 의미합니다 : *이 줄에서, 나는 그 객체를 더 이상 필요로하지 않을 것입니다; * autorelease는 다음을 의미합니다 : * 곧, 나는 더 이상 필요하지 않을 것입니다; 하지만 적어도이 방법을 벗어날 때까지 살아 있어야합니다. * (100 % 정확하지는 않지만 진실이 유용 할 정도로 충분히 가깝습니다) – DarkDust

    1
    NSMutableArray *firstArray = [[NSMutableArray alloc] initWithObjects: obj1,obj2,nil]; 
    NSMutableArray *secondArray = [[NSMutableArray alloc] init]; 
    secondArray = [firstArray mutableCopy]; 
    

    어떤 일이 일어나고 것은 메모리 누수를 만든 것입니다 예를 들어, 당신은 괜찮아요. firstArray의 mutableCopy를이 줄로 덮어 쓸 때 secondArray에 할당 된 참조를 잃어 버렸습니다.

    secondArray = [firstArray mutableCopy]; 
    

    당신이 다음 번 secondArray를 해제 경우 다음 덮어 쓰기를하지하고 있는지 확인하기 위해 당신이해야 할 것은

    secondArray = [firstArray mutableCopy]; 
    

    에 의해 할당 된 가변 배열을 overreleasing하고 있기 때문에, 프로그램이 충돌합니다 실수로 참조를 보유하고 균형을 유지합니다.