2009-08-19 6 views
0

私は実際にURLを返す文字列ユーティリティを持っています。私はあなたが[[NSString alloc] initWithFormatを実行すると、結果文字列を解放する必要があることを知っています。しかし、このケースは少し複雑で、私はそれに対処する方法がわかりません。私は別のクラスからgetChartURLメソッドを呼び出します。このコードスニペットでこれはどうやってリークではないのですか? (iphone sdk)

http://pastie.org/588817

+0

autoreleaseメソッドと自動解放プールを読んでください。これらは、この問題を処理するように特別に設計されています。さらに、クラスメソッドstringWithFormatを使用すると、自動解放されたバージョンのNSStringが返されます。 – Lounges

答えて

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

あなたはおそらく、彼らが望むなら、呼び出し元が文字列を保持したい、あなたはここに彼らのためにそれをやっているし、正しく使用しない、IWがこれをコーディングウルド方法は宣言することである場合には、リークを引き起こす可能性がありますベースURLのための自動解放ので

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:]を使う代わりにそれらを割り当てることをお勧めします。しかし、あなたがそれらを割り当てるならば、それらをどこかに解放しなければなりません。

1

自動解放あなたのリークを解決しながら。それは非常に便利ですが、ちょうどそれを酷使しないでください。この場合でも使用することは妥当と思われます。ここで

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

接尾辞とlabelsSuffixの両方を追加する必要があります。あなたはおそらくそれ以上getBaseURLのためのあなたの戻り値と同じことをしたいと思う

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

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

に変更することができます。

関連する問題