2009-08-14 3 views
0

난을 NSData 클래스 1의 retainCount 증가 각 반복 ADATA 내의 다음 코드을 NSData subdataWithRange 질문

while([outData length] + ptr[currentPacket].mDataByteSize < inBytesToGet && currentPacket < packetsCount) 
    { 
     NSLog(@" ++> %d", [aData retainCount]) ; 
     NSInteger sO = ptr[currentPacket].mStartOffset ; 
     NSInteger dS = ptr[currentPacket].mDataByteSize ; 
     NSLog(@"  get: cP: %d tP: %d mStartOffset: %d mDataByteSize: %d", currentPacket, packetsCount, sO, dS) ; 
     NSData *copyRange = [aData subdataWithRange: NSMakeRange(sO,dS)] ; 
     NSLog(@" => %d", [aData retainCount]) ; 
     [outData appendData:copyRange] ; 
     ptr[currentPacket].mStartOffset = bytesFilled + inOffset ; 
     [outPackets appendBytes: &ptr[currentPacket] length: sizeof(AudioStreamPacketDescription)] ; 
     currentPacket++ ; 
     bytesFilled += dS ; 
    } 

메모리 누수가 갖는 느낌 그리고 [ADATA subdataWithRange 후 happenes : NSMakeRange (따라서, DS) ] 전화 해 ... 나는 이유를 이해할 수 없다.

답변

3

"copyData"가 실제로 원본의 데이터를 참조하고있는 것 같습니다. 따라서 새 데이터 객체는 원본 객체에 대한 참조를 유지합니다. 실제 데이터의 복사본을 만들 필요가 없기 때문에 일반적으로 효율성 이점입니다. (예외는 작은 부분 범위를 유지하려는 경우입니다.)

NSAutoreleasePool이 활성 상태가되면 모든 데이터 객체가 올바르게 해제됩니다.

일반적으로 어쨌든 개체의 보유 개수를 보지 않아야합니다. 직접 제어 할 수없는 코드는 객체 참조에서 보유 및 릴리스의 균형을 올바르게 유지하는 한 원하는 모든 작업을 수행 할 수 있습니다. 누출이 염려되는 경우 Instruments 's Leaks 장비와 같은 적절한 도구를 사용하십시오.

+0

"retain과 release 사이의 균형이 적절히 유지되는 한"그리고 "autorelease"는 "적절하게"계산되지만 'retainCount'에는 바로 표시되지 않습니다. 'autorelease] retain] autorelease] retainCount]'는 4입니다. –

+1

글쎄, 나는 그것이 무엇보다 4 더하기 전에 말해야 만합니다. –