我实际上是一个返回URL的字符串实用程序。我知道当你执行[[NSString alloc] initWithFormat时,你必须通过manaully释放结果字符串。但这种情况有点复杂,我不知道如何处理它。
在这段代码中,我将从另一个类调用getChartURL方法:
答案 0 :(得分:1)
自动解决,同时解决您的泄漏问题。它可以非常方便,但不要过度使用它。在这种情况下使用似乎是合理的。
+(NSString*) getBaseURL {
…
return [baseURL autorelease];
}
答案 1 :(得分:1)
+(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;
}
在这里你可能希望调用者保留字符串,如果他们愿意,你在这里为他们做这件事,如果使用不当会导致泄漏,我应该通过声明自动释放baseURL来实现这一点/ p>
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:]而不是分配它们,但如果你分配它们,你必须在某处释放它们。
答案 2 :(得分:1)
后缀和labelsSuffix都需要在追加后释放。
returnURL = [[NSString alloc] initWithFormat: @"http://Iphoneopt.bravehost.com/largechart%d.png", time];
可以更改为:
returnURL = [NSString stringWithFormat: @"http://Iphoneopt.bravehost.com/largechart%d.png", time];
你可能也想对你上面的getBaseURL的返回值做同样的事情。