在iOS中写入NSOutputStream时使用CFString进行大量分配

在iOS中写入NSOutputStream时使用CFString进行大量分配,ios,sockets,memory-management,nsstring,Ios,Sockets,Memory Management,Nsstring,我在写入NSOutputStream时遇到大量分配问题。我正在一起使用几个类,它们应该是将数据从AudioUnit流式传输到远程服务器。代码如下: 音频处理器 Data *data = [Data sharedData]; //it's shared data I use to store information for the final socket intFromBuffer = audioBufferList->mBuffers[0].mData; NSUInteger leng

我在写入NSOutputStream时遇到大量分配问题。我正在一起使用几个类,它们应该是将数据从AudioUnit流式传输到远程服务器。代码如下:

音频处理器

Data *data = [Data sharedData]; //it's shared data I use to store information for the final socket

intFromBuffer = audioBufferList->mBuffers[0].mData;
NSUInteger length = audioBufferList->mBuffers[0].mDataByteSize;

NSMutableData *dataOut = [[NSMutableData alloc] initWithCapacity:0];
[dataOut appendBytes:(const void *)intFromBuffer length:length * sizeof(SInt16)];

[data setOutput:dataOut]; //it writes data to the shared data
Data.m

@implementation Data
NSMutableData *output;
NSMutableData *input;

@synthesize output;
@synthesize input;

+(id)sharedData {
static Data *sharedData = nil;

@synchronized(self) {
    if (sharedData == nil) {
        sharedData = [[self alloc] init];
    }
    return sharedData;
  }
}

-(void) setOutput:(NSMutableData*)outputt{
    output = outputt;
}

-(void) setInput:(NSMutableData*)inputt{
    input = inputt;
}

@end
网络通信

- (void) observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context {
//NSLog(@"changed!!!!");
if ([keyPath isEqualToString:@"output"]) {
    Data *data = [Data sharedData];
    [self writeOut:data.output];

    }
}

- (void)writeOut:(NSString *)s {
    NSString *dataTo = [NSString stringWithFormat:@"%@\n", s];
    NSData *data = [[NSData alloc] initWithData:[dataTo dataUsingEncoding:NSASCIIStringEncoding]];
    [outputStream write:[data bytes] maxLength:[data length]];
}
它通常会创建大量数据,在2,5分钟内,虚拟内存中的数据量约为200 MB。我试图简单地将
stringWithFormat:
直接传递给我的
writeOut:
函数,但它没有给出任何信息,也不知道如何处理它

如果有人问我为什么使用stringWithFormat,仅仅是因为我需要为服务器输入
\n
来读取消息

非常感谢您的帮助

编辑1:

我用不同的方式把它系好。在我的AudioProcessor.m中(因为数据是在记录器回调中创建的),我将其设置为:

dataOut = [[NSMutableData alloc] initWithCapacity:0];
[dataOut appendBytes:(const void *)intFromBuffer length:length * sizeof(SInt16)];

net = [NetworkCommunication init];

const char *s = [dataOut bytes];

[[net outputStream] write:s maxLength:strlen(s)];

现在,它使用
NSThread callStackSymbol
NSThread callStackReturnAddresses
生成类型为Malloc 1,00KB和Malloc 2,00KB的疯狂分配。还有什么问题吗?

是否尝试发送C字符串

const char *s = [dataTo UTF8String];
[outputStream write:s maxLength:strlen(s)];