0

내 응용 프로그램에서 AudioFileOpenWithCallbacks 함수를 사용하여 MP3 데이터를 청크로 제공합니다.Obj-C 객체가 C 콜백 함수에서 해제되지 않음

이때
AudioFileOpenWithCallbacks((__bridge void *)(self), TTMAudioFile_ReadProc, NULL, TTMAudioFile_GetSizeProc, NULL, 0, &aqData.mAudioFile); 

, self가 함유 오브젝티브 C 클래스이며 다음과 같다 : I 함수를 호출한다.

OSStatus TTMAudioFile_ReadProc(void *inClientData, SInt64 inPosition, UInt32 requestCount, void *buffer, UInt32 *actualCount) { 

    TTMAudioQueuePlayer *this = (__bridge TTMAudioQueuePlayer *)inClientData; 
    NSData *data = [this.decryptor dataAtOffset:inPosition length:requestCount error:NULL]; 
    memcpy(buffer, data.bytes, data.length); 

    NSUInteger length = data.length; 
    *actualCount = (UInt32)length; 

    return noErr; 
} 

이 작동하지만있는 NSData가 해제되지 않는 다음과 같이

TTMAudioFile_ReadProc 콜백 함수입니다. 악기의 프로파일 할당은 다음과 같이 많은 할당 공개 :

enter image description here

은 분명히 내 콜백 함수에 두 개의 추가 retain 호출이 있습니다,하지만 내가 그들을 유지 할 수있는 I는 표시되지 않습니다. 또한, 나는 ARC를 사용하고 있는데, 왜 이런 일이 일어나는지 모른다.

+0

더 많은 코드를 보지 않고도 디버그하기가 정말 어렵습니다. 'dataAtOffset'의 기능은 무엇입니까? – Sulthan

답변

0

자동 풀이 필요합니다.

C 콜백 함수 TTMAudioFile_ReadProc은 주 스레드와 별도의 스레드에서 호출됩니다. 이 경우 디스패치 대기열을 사용하여 작업 할 때와 달리 자동 릴리스 풀이 자동으로 생성되지 않습니다.

OSStatus TTMAudioFile_ReadProc(void *inClientData, SInt64 inPosition, UInt32 requestCount, void *buffer, UInt32 *actualCount) { 
    @autoreleasepool { 
     TTMAudioQueuePlayer *this = (__bridge TTMAudioQueuePlayer *)inClientData; 
     NSData *data = [this.decryptor dataAtOffset:inPosition length:requestCount error:NULL]; 

     memcpy(buffer, data.bytes, data.length); 
     NSUInteger length = data.length; 
     *actualCount = (UInt32)length; 

     return noErr; 
    } 
} 
관련 문제