我的应用程序就像 Vine 或 Instagram,它们记录小片段并将它们连接在一起。创建avasset时内存管理有问题。如果我从一开始就创建了 100 个 AVAsset 对象,它工作正常。但是,如果我继续删除其中的一些,甚至全部删除,然后再次创建新的,我会收到内存警告并响应内存压力。我用 Instrument 检查了我正在运行的应用程序,没有内存泄漏。下面是我如何在数组资产中创建和删除 AVAsset 对象。有谁知道可能是什么问题?
- (void) copyFileToDocuments:(NSURL *)fileURL
{
NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd_HH-mm-ss"];
NSString *destinationPath = [documentsDirectory stringByAppendingFormat:@"/output_%@.mov", [dateFormatter stringFromDate:[NSDate date]]];
NSError *error;
if (![[NSFileManager defaultManager] copyItemAtURL:fileURL toURL:[NSURL fileURLWithPath:destinationPath] error:&error]) {
if ([[self delegate] respondsToSelector:@selector(captureManager:didFailWithError:)]) {
[[self delegate] captureManager:self didFailWithError:error];
}
}
//add asset into the array or pieces
AVAsset *asset = [AVAsset assetWithURL:[NSURL fileURLWithPath:destinationPath]];
[self.assets addObject:asset];
}
-(void) deleteLastAsset
{
AVAsset *asset = [self.assets lastObject];
[self.delegate removeTimeFromDuration:CMTimeGetSeconds(asset.duration)];
NSURL *fileURL = nil;
if ([asset isKindOfClass:AVURLAsset.class])
{
AVURLAsset *urlAsset = (AVURLAsset*)asset;
fileURL = urlAsset.URL;
}
if (fileURL)
[self removeFile:fileURL];
[self.assets removeLastObject];
}
- (void) startRecording
{
if ([[UIDevice currentDevice] isMultitaskingSupported]) {
[self setBackgroundRecordingID:[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{}]];
}
[self removeFile:[[self recorder] outputFileURL]];
[[self recorder] startRecordingWithOrientation:self.orientation];
}
- (void) removeFile:(NSURL *)fileURL
{
NSString *filePath = [fileURL path];
NSFileManager *fileManager = [NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:filePath]) {
NSError *error;
if ([fileManager removeItemAtPath:filePath error:&error] == NO) {
if ([[self delegate] respondsToSelector:@selector(captureManager:didFailWithError:)]) {
[[self delegate] captureManager:self didFailWithError:error];
}
}
}
}
-(void)startRecordingWithOrientation:(AVCaptureVideoOrientation)videoOrientation;
{
AVCaptureConnection *videoConnection = [AVCamUtilities connectionWithMediaType:AVMediaTypeVideo fromConnections:[[self movieFileOutput] connections]];
if ([videoConnection isVideoOrientationSupported])
[videoConnection setVideoOrientation:AVCaptureVideoOrientationPortrait];
[[self movieFileOutput] startRecordingToOutputFileURL:[self outputFileURL] recordingDelegate:self];
}
-(void)stopRecording
{
[[self movieFileOutput] stopRecording];
}