2

理解度の問題があります。この方法は次のとおりです。

- (NSArray*)test {
 NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://stackoverflow.com/"]];
 NSString *result = [[NSString alloc] initWithBytes:[data bytes] 
            length:[data length] 
             encoding:NSMacOSRomanStringEncoding];
 result = [result stringByAppendingString:@"something"];
 NSArray *arr = [NSArray arrayWithObject:result];
 //[result release];
 return arr;
}

コメントを外すとrelease、アプリがクラッシュし、リリースされたオブジェクトにアクセスできないと言います。文字列をing し
ないと、 Instruments はリーク (NSPlaceholderString) を報告します。releaseresult

私はautoreleaseそれと同じ行でそれを行うことができます。それallocは問題を解決するでしょう(私は現在アプリでやっています)。

私が正しく理解していればstringByAppendingString:、「古い」結果の割り当てを解除できるように、自動解放されたオブジェクトを作成する必要があります。次に、メソッドarrayWithObject:copyオブジェクトを配列に入れる必要があります。だから私の考えは、配列にコピーされた後に文字列を解放することでした。

私の知識に何かが欠けているか、何か間違っていますか?

4

2 に答える 2

11

コードを 1 行ずつ見ていきましょう。

- (NSArray*)test {
 NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://stackoverflow.com/"]];

これにより、データ オブジェクトが作成されます。あなたはそれを所有していませんが、メソッドの残りの時間は残ります。ここまでは順調ですね。

 NSString *result = [[NSString alloc] initWithBytes:[data bytes] 
                                             length:[data length] 
                                           encoding:NSMacOSRomanStringEncoding];

これにより、所有する文字列オブジェクトが作成されます。繰り返しますが、ここでは問題ありません。後でリリースする必要があるだけです。

result = [result stringByAppendingString:@"something"];

にあった文字列オブジェクトへの参照を破棄し、result所有していない新しい文字列オブジェクトを格納します。元の文字列を解放できなくなったため、これはリークです。また、新しい文字列は自動解放されたオブジェクトとして扱うことができることに注意してください。つまり、解放しないでください。

NSArray *arr = [NSArray arrayWithObject:result];

あなたの信念に反して、これは何もコピーしません。新しい文字列への参照を保持し、それを保持するだけです。

//[result release];

result含まれているオブジェクトはあなたが所有するものではないため、この時点で解放しないでください。名前に、、またはstringByAppendingString:を含むメソッドからではなく、から取得したものです。所有していないこのオブジェクトを解放すると、ほぼ確実にクラッシュが発生します。あなたが所有していて解放すべき古いオブジェクトは 2 行前に失われており、代わりに別のものを解放しても役に立ちません。newallocretaincopy

于 2010-12-27T20:55:28.293 に答える
8
result = [result stringByAppendingString:@"something"];

この行は、最初に割り当てられた文字列を新しい自動解放された文字列に置き換えます。

したがって、最初の文字列はリークされ、2 番目の文字列は解放されません。これは、リリース行のコメントを外すとクラッシュする理由を説明しています。

于 2010-12-27T20:35:19.177 に答える