Я использую NSInputstream
& NSOutputstream
, чтобы установить соединение и отправить данные. Мой объект потока имеет функцию открытия и закрытия потока. Я использую следующий код:Утечки памяти в CFStreamCreatePairWithSocketToHost iOS
@interface Stream()
{
NSInputStream *inputStream;
NSOutputStream *outputStream;
}
-(id)init
{
self = [super init];
if (self)
{
inputStream = nil;
outputStream = nil;
}
return self;
}
-(int)streamOpenWithIp:(NSString *)ip withPortNumber:(int)portNumber;
{
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, (__bridge CFStringRef)ip, portNumber, &readStream, &writeStream);
if(readStream && writeStream)
{
//Setup inpustream
inputStream = (__bridge NSInputStream *)readStream;
[inputStream setDelegate:self];
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[inputStream open];
//Setup outputstream
outputStream = (__bridge NSOutputStream *)writeStream;
[outputStream setDelegate:self];
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[outputStream open];
}
}
- (int)streamClose;
{
CFReadStreamSetProperty((__bridge CFReadStreamRef)(inputStream), kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);
CFReadStreamSetProperty((__bridge CFReadStreamRef)(outputStream), kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);
//Close and reset inputstream
[inputStream setDelegate:nil];
[inputStream close];
[inputStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
inputStream = nil;
//Close and reset outputstream
[outputStream setDelegate:nil];
[outputStream close];
[outputStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
outputStream = nil;
}
Этот код отлично работает, когда я открываю и закрываю поток много раз. Когда я проверяю свое приложение на утечку памяти с помощью инструментов, он сказал, что функция CFStreamCreatePairWithSocketToHost
пропускает память на 72%. Кто-нибудь знает, что я делаю неправильно? Я не могу понять.
Я использую автоматический подсчет ссылок в моем проекте, поэтому я не могу использовать выпуск. Это делается автоматически для меня? –
проверить мои обновления – Mar0ux
Это сработало! Больше нет утечек памяти. Я думаю, вы имеете в виду NSInputStream вместо NSString в своем ответе? –