Как я могу сделать это не утечка? (iphone SDK)
У меня фактически есть строковая утилита, которая возвращает URL. Я знаю, что когда вы выполняете [[NSString alloc] initWithFormat, вы должны вручную освободить строку результата. Но этот случай немного сложен, и я не уверен, как с этим бороться.
В этом фрагменте кода я буду вызывать метод getChartURL из другого класса:
3 ответа
+(NSString*) getBaseURL {
NSUserDefaults *userSettings = [NSUserDefaults standardUserDefaults];
NSString* host = [userSettings stringForKey:@"host"];
NSString* port = [userSettings stringForKey:@"port"];
NSString* baseURL = [[NSString alloc] initWithFormat: @"http://%@:%@", host, port];
return baseURL;
}
Здесь вы, вероятно, хотите, чтобы вызывающая сторона сохранила строку, если они пожелают, вы делаете это для них здесь, и это может вызвать утечки, если не используется должным образом, как я могу это кодировать, объявив autorelease для baseURL, так
NSString* baseURL = [[[NSString alloc] initWithFormat: @"http://%@:%@", host, port]autorelease];
return baseURL;
}
Вот
+(NSString*) getChartURL:(int)width height:(int)height labels:(BOOL)labels time:(int)time monitorId:(NSString*)monitorId ruleInstanceId:(NSString*)ruleInstanceId {
NSString* returnURL;
if ([self isConfigured]){
NSString* suffix = [[NSString alloc] initWithFormat: @"/Mobile/ChartServlet?width=%d&height=%d&time=%d&monitor_id=%@&rule_instance_id=%@", width, height, time, monitorId, ruleInstanceId];
returnURL = [[self getBaseURL] stringByAppendingString:suffix];
} else {
if (width == 320) {
returnURL = @"http://Iphoneopt.bravehost.com/smallchart.png";
} else {
returnURL = [[NSString alloc] initWithFormat: @"http://Iphoneopt.bravehost.com/largechart%d.png", time];
labels = FALSE;
}
}
if (labels) {
NSString* labelsSuffix = [[NSString alloc] initWithFormat: @"&labels=%d", labels];
returnURL = [returnURL stringByAppendingString:labelsSuffix];
}
NSLog(@"returnURL=%@", returnURL);
return returnURL;
}
здесь вы не освобождаете ни одну из выделенных вами строк, я предлагаю использовать [NSString stringWithFormat:] вместо их выделения, но если вы выделяете их, вы должны их где-то освобождать.
Суффикс и labelSuffix должны быть освобождены после их добавления.
returnURL = [[NSString alloc] initWithFormat: @"http://Iphoneopt.bravehost.com/largechart%d.png", time];
может быть изменено на:
returnURL = [NSString stringWithFormat: @"http://Iphoneopt.bravehost.com/largechart%d.png", time];
Возможно, вы также захотите сделать то же самое с вашим возвращаемым значением для getBaseURL над ним.
Авто-релиз пока решает ваши утечки. Это может быть очень удобно, но не злоупотребляйте им. Кажется разумным использовать в этом случае все же.
+(NSString*) getBaseURL {
…
return [baseURL autorelease];
}