警告内で使用するNSStringオブジェクトを宣言したいが、その実際の内容はいくつかの変数によって決まるさまざまな要因に依存する。私はこれに最も近づける方法が不思議です。私はこのような何かやったほとんどの場合:私は、ビルド・アナライザを介してこれを実行すると複数の可能な値を持つNSStringを宣言する方法
- (void)info {
NSString *targetString = [[NSString alloc] init];
switch (self.target) {
case 1:
targetString = @"ONE";
break;
case 2:
targetString = @"TWO";
break;
case 3:
targetString = @"THREE";
break;
default:
targetString = @"";
break;
}
NSString *message = [[NSString alloc] initWithFormat:@"Text: %@", targetString];
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle:@"Info"
message:message
delegate:self
cancelButtonTitle:@"Ok!"
otherButtonTitles:nil];
alert.tag = kInfoAlert;
[alert show];
[alert release];
[targetString release];
[message release];
}
をしかし、私は、文字列がメモリをリークしている私に告げるメッセージが出ます:すべての
まずそれは言う:
中の 'targetString' に保存され値は、その初期化が
次に読まれることはありません:
オブジェクトの潜在的な漏れは、ライン137上 を割り当てられ に格納されたライン136は
ある 'targetString'
NSString *targetString = [[NSString alloc] init];
これら2つのコメントは、ライン136と137であります
代わりに、文字列を
のように宣言することがあります。NSString *targetString;
どうなるか
となど
、あるいは最後にそれを解放するために、それぞれの場合の文字列をallocing
targetString = [NSString stringWithFormat:@"ONE"];
として、それぞれの場合に、それを設定し...まあ
、ここに最善のアプローチ?
おかげで、
マイケル:)
だから、僕はNSStringの* targetStringとしてそれを宣言した後、targetString = @ "ONE" のようにそれを設定する必要がありますか? – Smikey
いいえとして宣言してください。'NSString * targetString = nil;'そしてそれをswitchステートメントのリテラルに設定します。また、文字列に設定するときにtargetStringを解放する必要はありません。 – Joe
設定している文字列が単純なリテラルでない場合、つまり[[NSString alloc] initWithFormat:@ "Some text plus%@"、someString]のような宣言が必要です。それから私は記憶を割り当てています。私は代わりに便利な方法を使うべきですか? – Smikey