Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
以编程方式在iPhone中混合2个Wav文件_Iphone_Xcode - Fatal编程技术网

以编程方式在iPhone中混合2个Wav文件

以编程方式在iPhone中混合2个Wav文件,iphone,xcode,Iphone,Xcode,我在将2.wav文件混合在一起时面临一个问题 我正在使用此站点中的代码: 现在我面临的问题是,代码通常适用于小于10秒的wav文件,超过10秒会导致应用程序崩溃 出于某种奇怪的原因,即使我在For循环结束时正确地释放对象,For循环包含超过10万次迭代,并且随着记录大小的增加而增加,但对象似乎不会被释放并占用内存 下面是我的for循环: short iValueWav1Sample; short iValueWav2Sample; short iValueWavSampleAverage; f

我在将2.wav文件混合在一起时面临一个问题

我正在使用此站点中的代码:

现在我面临的问题是,代码通常适用于小于10秒的wav文件,超过10秒会导致应用程序崩溃

出于某种奇怪的原因,即使我在For循环结束时正确地释放对象,For循环包含超过10万次迭代,并且随着记录大小的增加而增加,但对象似乎不会被释放并占用内存

下面是我的for循环:

short iValueWav1Sample;
short iValueWav2Sample;
short iValueWavSampleAverage;

for (int i=0; i<(outputWavDataSize/2); i++)
{
    //simulate little endian by flipping the bytes
    wav1DataBuffer1 = [[NSData alloc]initWithData:[wav1Data subdataWithRange:NSMakeRange(44 + (i*2), 1)]];
    wav2DataBuffer1 = [[NSData alloc]initWithData:[wav2Data subdataWithRange:NSMakeRange(44 + (i*2), 1)]];
    wav1DataBuffer2 = [[NSData alloc]initWithData:[wav1Data subdataWithRange:NSMakeRange(44 + (i*2) + 1, 1)]];
    wav2DataBuffer2 = [[NSData alloc]initWithData:[wav2Data subdataWithRange:NSMakeRange(44 + (i*2) + 1, 1)]];
    littleEndianHexWav1Sample = [[NSMutableData alloc] initWithData:wav1DataBuffer1];
    [littleEndianHexWav1Sample appendData:[NSMutableData dataWithData:wav1DataBuffer2]]; 
    littleEndianHexWav2Sample = [[NSMutableData alloc]initWithData:wav2DataBuffer1];
    [littleEndianHexWav2Sample appendData:wav2DataBuffer2];

    NSString* wav1HexString = [[littleEndianHexWav1Sample description] substringWithRange:NSMakeRange(1, 4)];
    NSString* wav2HexString = [[littleEndianHexWav2Sample description] substringWithRange:NSMakeRange(1, 4)];
    unsigned wav1Hexint;
    unsigned wav2Hexint;

    [[NSScanner scannerWithString:wav1HexString] scanHexInt:&wav1Hexint];   
    [[NSScanner scannerWithString:wav2HexString] scanHexInt:&wav2Hexint];   
    unsigned wavAverage;

    wavAverage = (wav1Hexint+wav2Hexint);
    iValueWav1Sample = wav1Hexint;
    iValueWav2Sample = wav2Hexint;
    iValueWavSampleAverage = wavAverage;

    bigEndian = [[NSData alloc ]initWithBytes:&iValueWavSampleAverage length:2];
    littleEndian = [[NSMutableData alloc] initWithData:[bigEndian subdataWithRange:NSMakeRange(1, 1)]];
    [littleEndian appendData:[bigEndian subdataWithRange:NSMakeRange(0, 1)]];

    [headerBuffer appendData:littleEndian];

    //Release stuff 

    [wav1HexString release]; 
    [wav2HexString release]; 


    [wav1DataBuffer1 release]; 
    [wav2DataBuffer1 release];
    [wav1DataBuffer2 release];
    [wav2DataBuffer2 release]; 

    [littleEndianHexWav1Sample release];
    [littleEndianHexWav2Sample release];
    [bigEndian release];
    [littleEndian release];

    wav1DataBuffer1 = nil;
    wav2DataBuffer1= nil; 
    wav1DataBuffer2 = nil;
    wav2DataBuffer2 = nil;

    littleEndianHexWav1Sample= nil;
    littleEndianHexWav2Sample= nil; 
    bigEndian= nil;
    littleEndian= nil;

}
现在我要做的是,在for循环中创建wav1Data和wav2Data,然后在最后释放它们

我已经解决了内存泄漏问题,但现在又出现了另一个问题,for循环的执行速度大大降低。这一定是因为每次迭代时我都会初始化文件的内容


有什么建议或想法吗

我在这里看到的是,您的应用程序可能会崩溃,这主要是因为您正在UI线程上执行更大的操作。您需要在非UI/后台线程中调用此操作。以下是您如何做到这一点:

NSOperationQueue *queue = [NSOperationQueue new];
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self
                                                                        selector:@selector(processWave:)
                                                                          object:nil;
[queue addOperation:operation];
[operation release];
[queue release];

更不用说您可能需要自己创建processWave


如果它仍然崩溃,请告诉我

嘿,乌斯曼,谢谢你的帮助。请检查我所做的编辑,我添加了更多信息。
NSOperationQueue *queue = [NSOperationQueue new];
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self
                                                                        selector:@selector(processWave:)
                                                                          object:nil;
[queue addOperation:operation];
[operation release];
[queue release];
[NSThread detachNewThreadSelector: @selector(processWave) toTarget:self withObject:NULL];