NSString утечка памяти - PullRequest
       24

NSString утечка памяти

1 голос
/ 20 августа 2011

Я немного новичок в поиске утечек памяти в цели c и способах их устранения. Я знаю, как использовать alloc / init / copy и release / retain, но (по крайней мере, я так думаю :-)), но у меня есть некоторые странные утечки памяти в моем приложении IOS.

-(void) sendStats {

// read the app settings
plistHandler *readData  = [[plistHandler alloc] init];
[readData setPlistName:@"Settings"];
NSDictionary *settingsArray  = [readData readPlist];
[readData release];

NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
[f setNumberStyle:NSNumberFormatterDecimalStyle];
NSNumber * myNumber = [f numberFromString:[NSString stringWithFormat:@"%@", [settingsArray objectForKey:@"range"]]];
[f release];

int rangeForUrl;

if(myNumber != nil) {
    rangeForUrl = [myNumber intValue];
} else {
    rangeForUrl = 10;
}

// get uniqe device ID
UIDevice *getdev = [UIDevice currentDevice];
NSString *uniqueIdentifier = [getdev uniqueIdentifier];

NSString *deviceId  = [NSString stringWithFormat:@"IOS-%@", uniqueIdentifier];

// get the unix timestamp
NSDate * past = [NSDate date];
NSTimeInterval oldTime = [past timeIntervalSince1970]; 
NSString * unixTime = [[[NSString alloc] initWithFormat:@"%0.0f", oldTime] autorelease];


// send the data with a post request to the API
HttpRequest *data = [[HttpRequest alloc] init];
data.postData   = [NSString stringWithFormat:@"&device=%@&age=%@&gender=%@&latitude=%@&longitude=%@&timestamp=%@", deviceId, [settingsArray objectForKey:@"age"], [settingsArray objectForKey:@"gender"], @"00", @"00", unixTime];

data.controller = @"sendDevice";

NSString *url   = [NSString stringWithFormat:@"http://www..eu/api/send_device"];

[data loadHostName:url];

[data release];

//NSLog(@"string s: %@", data.postData);

}

Это утечка памяти в соответствии с инструментами Xcode => утечки:

Утечка объекта # Размер адреса Ответственная библиотека Ответственный кадр NSCFString, 0x16cb40 144 байта Основание - [NSPlaceholderString initWithFormat: locale: arguments:]

Это строка с «data.postData = ...» в моем коде. Кто-нибудь может мне помочь?

так я использую postData в классе httpRequest:

- (void)loadHostName:(NSString *)hostName {



responseData = [[NSMutableData alloc] init];
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@", hostName]];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

if(authString) {
    [request setValue:authString forHTTPHeaderField:@"Authorization"];
}

if([postData isKindOfClass:[NSString class]] && postData != @"") {

    NSData *dataToPost = [postData dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
    NSString *postLength = [NSString stringWithFormat:@"%d",[dataToPost length]];
    [request setHTTPMethod:@"POST"];
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Current-Type"];
    [request setHTTPBody:dataToPost];

}

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[connection release];

}

с конечно:

NSString * postData; @property (nonatomic, retain) NSString * postData;

и

@ синтезировать postData;

1 Ответ

1 голос
/ 20 августа 2011

Вам нужно выпустить postData в dealloc.

выглядит как исправлено.Но я не очень понимаю, как работает dealloc.Я никогда не делал alloc / init для postData.Означает ли это, что каждый объект в моем файле .h, например postData, должен быть освобожден в dealloc в файле .m?

Говоря о свойствах, вам нужно освободить в dealloc все ваши свойства не помечено assign (вместе с любой вашей переменной экземпляра, не являющейся собственностью).Не assign свойства владеют объектом, хранящимся в переменной экземпляра резервного копирования , поэтому вам необходимо отказаться от владения им, отправив ему сообщение release в dealloc.

От «Язык программирования Objective-C» :

Объявленные свойства вместе с директивой @synthesize заменяют объявления методов доступа;когда вы синтезируете свойство, компилятор создает методы доступа по мере необходимости.Однако прямого взаимодействия между объявлением свойства и методом dealloc нет - свойства не освобождаются автоматически для вас.Объявленные свойства, тем не менее, предоставляют полезный способ перекрестной проверки реализации вашего метода dealloc: вы можете найти все объявления свойств в вашем заголовочном файле и убедиться, что свойства объекта, не помеченные как assign, освобождены, а те, которые помечены как assign,не выпущено.

Я бы также рекомендовал прочитать «Руководство по программированию управления памятью» .

...