2012-01-02 13 views
1

私はこの文字列のコードを持っていますが、メモリを解放しようとすると問題が発生します。解放する人だけが初期化し、autoreleaseしていないことを理解しましたが、 "end"という文字列、 。NSStringリリース

NSString *urlBase = [[NSString alloc] initWithFormat:@"http://service.svc/"]; 
NSString *op = [[NSString alloc] initWithFormat:@"op1"]; 
NSString * final = [urlBase stringByAppendingFormat:op]; 
NSString * nSum = sumTextfield.text; 
final = [final stringByAppendingFormat:nSum]; 

//release 

[ urlBase release ]; 
[ op release ]; 
//[final release]; error 
//[final autorelease]; error 

ありがとうございます。

UPDATE:

- (IBAction)mostrarOpciones { 
// code (UP) 
} 

答えて

3

は、init、新しい、コピー、またはmutableCopyで始まるメソッドを使用してオブジェクトを作成する場合は、あなたがそのオブジェクトを所有し、それを解放する(またはそれを自動解放)を担当しているときあなたはそれで終わった。他の方法を使用してオブジェクトを作成すると、そのオブジェクトは自動リリースされ、解放する必要はありません。その場合、オブジェクトを保持したい場合は、実際にオブジェクトを保持する必要があります。 Appleにはこれらすべてのルールを含むMemory Management Programming Guideがあります。

あなたが投稿したコードは実際には正しいです。 urlBaseopは、init(この場合はinitWithFormat:)で始まるメソッドを使用して作成したため、リリースする必要があります。 finalとnSumは既に自動リリースされています。 finalは、init、new、copyまたはmutableCopy(この場合はファクトリメソッドstringByAppendingFormat:)で始まらないメソッドによって作成されました。 nSumはtextというメソッドによって返され、sumTextFieldがそれを所有していると仮定するか、返却する前に自動リリースしているので、解放する責任はありません。

+0

autoreleaseを適用して最終的に私はエラーが発生します。私はこれらの文字列がIBActionにあると言って忘れて、私は3番目の呼び出しボタンでエラーを取得します。 – JohnPortella

+0

はい、私が慎重に書いた内容を読んでいると、最終版はすでに入手した時点ですでに自動リリースされていると言われるので、自分でリリースする必要はありません。あなたがそれを自動リリースすると、それは2回オートリースされてしまいます。つまり、最終的に2回リリースされ、クラッシュします。 –

+0

今、私はそのような呼び出しを持つことによって決勝はオートリリースで来ることを理解しました。お手伝いありがとう。 – JohnPortella

0

割り当てられていないNSStringを解放することはできません。あなたの2つの変数は割り当てられていないので、解放する必要はありません。