0

responseData = [NSMutableData data];を使用する場合、アプリで JSON 解析を行っています。[responseData setLength:0] でクラッシュします。

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {

   [responseData setLength:0];   // CRASH HERE

}

responseData=[[NSMutableData alloc]init];を使用すると、私のプログラムは正常に動作します。私はすでに.hファイルにプロパティを作成しています

@property (strong, nonatomic) NSMutableData* responseData;

.mファイルに合成します

@synthesize responseData;

質問: [NSMutableData data][[NSMutableData alloc]init]の違いは何ですか?

ありがとう

4

2 に答える 2

6

[NSMutableData data]自動解放されたオブジェクト[[NSMutableData alloc] init]を返しますが、保持されたオブジェクトを返します。

于 2012-09-13T07:09:10.723 に答える
2

[NSMutableData data]オブジェクトを返しautoreleaseます。つまり、オブジェクトは自動解放プールに追加され、フレームの終わりにそのオブジェクトで解放が呼び出され、参照カウントが0になると、メモリから削除されます。

[[NSMutableData alloc] init]は参照カウント1のオブジェクトを返します。ここでreleaseは、完了したら、を呼び出して明示的にメモリからオブジェクトを削除する必要があります。

したがって、問題の解決策は次のとおりです。

// 1. retain explicitly
responseData = [[NSMutableData data] retain];

// 2. or else define
@property (retain, nonatomic)

2番目のオプションは、オブジェクトを保持します。したがって、プールでrelease呼び出された場合でもautorelease、保持されているためフラッシュされません(参照カウントはゼロになりません)

を使用しているself.responseDataと、その参照カウントは1増加します。したがって、オブジェクトを割り当てても、autorelease宣言されたプロパティのためにオブジェクトは保持されます。

self.responseData = [NSMutableData data];
于 2012-09-13T07:30:39.067 に答える