절대 보유 횟수에 신경 쓰지 않아야합니다. 단지 "균형 잡힌"즉, 모든 alloc
, new*
, copy
, mutableCopy
및 retain
을 의미합니다. 해당 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
copy
및 mutableCopy
. 즉, release
및/또는 autorelease
이라는 해당 번호로 전화해야합니다. 당신이 [[obj retain] retain];
을 다음 [[obj autorelease] release];
나는 소유하고 있으며 어떤 단계에서 공개해야하는 두 개의 개체가 있다고 덧붙입니다. 그리고 당신 말이 맞아요. - retainCount는 유일합니다. 소유 전화와 전화를 끊는 것에 대해서만 걱정할뿐입니다. – Abizern
실제로 secondArray가 코드에서 멀리 떨어져 할당되어 사용되었습니다. 편의를 위해 두 번째 줄에 썼습니다.그래서 내가 메모리 누수를 피하기 위해 당신을 바로 잡았다면, 먼저 secondArray를 릴리즈해야하며 이것이 절대적으로 유효할까요? –
@AndreyChernukha : 일단 완료되면'secondArray'가 가리키는 객체 만 놓습니다. 'release '는 다음을 의미합니다 : *이 줄에서, 나는 그 객체를 더 이상 필요로하지 않을 것입니다; * autorelease는 다음을 의미합니다 : * 곧, 나는 더 이상 필요하지 않을 것입니다; 하지만 적어도이 방법을 벗어날 때까지 살아 있어야합니다. * (100 % 정확하지는 않지만 진실이 유용 할 정도로 충분히 가깝습니다) – DarkDust