【发布时间】:2025-12-07 16:05:02
【问题描述】:
我正在编写一个库来使用 AVFoundation 将资产导出到文件。我创建了一个读取器、一个写入器,将输入和输出连接到它们,然后在输入上调用 requestMediaDataWhenReadyOnQueue 方法以开始提取数据。提供给此方法的块回调看起来有点像这样:
[input requestMediaDataWhenReadyOnQueue:queue usingBlock:^{
while ([input isReadyForMoreMediaData]) {
CMSampleBufferRef buffer;
// The track has some more data for us
if ([reader status] == AVAssetReaderStatusReading
&& (buffer = [output copyNextSampleBuffer])) {
BOOL result = [input appendSampleBuffer:buffer];
CFRelease(buffer);
if (!result) {
// handle error
break;
}
// The track is finished, for whatever reason
} else {
[input markAsFinished]; ⬅
switch ([reader status]) {
// inspect the status and act accordingly
}
}
}
}];
这在 iOS 5 上完美运行,但在 iOS 4 上,代码在标有 ⬅ 箭头的行之后死于 EXC_BAD_ACCESS。经过一番摸索后,我觉得在将输入标记为完成后立即以某种方式破坏了该块。在执行坏行之前完全有效的self 指针不知何故变成了0xfff… 或调试器报告的某个垃圾值。但是之前指向它的对象很好,正如僵尸工具所证实的那样,它没有被释放。
我错过了什么?
【问题讨论】:
-
你解决了这个问题吗?
标签: objective-c ios memory-management avfoundation