2009-08-19 7 views
0

Ich habe tatsächlich ein String-Dienstprogramm, das eine URL zurückgibt. Ich weiß, dass wenn Sie ein [[NSString Alloc] InitWithFormat tun, müssen Sie manuell die Ergebniszeichenfolge freigeben. Aber dieser Fall ist ein bisschen kompliziert und ich bin mir nicht sicher, wie ich damit umgehen soll.wie mache ich das nicht undicht? (iphone sdk)

In diesem Code-Snippet Ich werde die getChartURL Methode von einer anderen Klasse anrufen:

http://pastie.org/588817

+0

Lesen Sie sich die Autorelease-Methode und die Auto Release-Pools durch. Sie sind speziell für dieses Problem konzipiert. Wenn Sie die Klassenmethode stringWithFormat verwenden, wird darüber hinaus eine automatisch freigegebene Version von NSString zurückgegeben. – Lounges

Antwort

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; 
    } 

Hier möchten Sie wahrscheinlich der Anrufer die Zeichenfolge behalten, wenn sie es wünschen, Sie tun es für sie hier, und es kann Lecks verursachen, wenn sie nicht ordnungsgemäß verwendet wurden, die Art und Weise iw dies Code Ould indem er erklärt, Autorelease für die baseURL so

NSString* baseURL = [[[NSString alloc] initWithFormat: @"http://%@:%@", host, port]autorelease]; 
     return baseURL; 
    } 

hier

+(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; 
     } 

hier nicht veröffentlichen jede von der Zeichenfolge, die Sie zugewiesen haben, schlage ich vor, [NSString stringWithFormat:] anstelle von Zuweisung zu verwenden, aber wenn Sie sie zuweisen, müssen Sie sie irgendwo freigeben.

1

Autorelease, während die Lecks lösen. Es kann sehr praktisch sein, aber benutze es nicht zu sehr. Es scheint jedoch vernünftig, in diesem Fall zu verwenden.

+(NSString*) getBaseURL { 
    … 
    return [baseURL autorelease]; 
} 
1

Suffix und LabelsSuffix müssen beide nach dem Anhängen freigegeben werden.

returnURL = [NSString stringWithFormat: @"http://Iphoneopt.bravehost.com/largechart%d.png", time]; 

Sie würden wahrscheinlich wollen auch mit Ihrem Rückgabewert für getBaseURL darüber, dasselbe zu tun:

returnURL = [[NSString alloc] initWithFormat: @"http://Iphoneopt.bravehost.com/largechart%d.png", time]; 

könnte geändert werden.