2011-07-29 5 views
0

しかし、この問題について質問されている質問はたくさんありますが、それらを読んでメソッドを試しても、私のアプリはまだメモリをリークしているようです。私はApple Guide on Memory Manegmentを学び、注目すべき質問here,hereおよびhereを読みました。私は、JSON文字列を解析し、それらをNSMutableDictionaryに返すメソッドを持っています。返すメソッドのオブジェクトに対してautoreleaseを呼び出し、受信メソッドでretainを呼び出します(オブジェクトがプールの次のドレインでdeallocされないことを保証します)。その後、私はそれを完了したときにオブジェクトを解放します。しかしそれはまだ漏れている。誰でも私が間違っていることを見ることができますか?Objective C自動リリースオブジェクトのメモリがリークする

戻るメソッドクラス

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    [connection release]; 

    NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; 
    [responseData release]; 

    //This class will take the responsibility of the object's ownership 
    self.jsonArray = [[SpecialtyUrl parseSpecialtyResult:responseString] retain]; 

    [tableView reloadData]; 

    [responseString release]; 
} 

- (void)dealloc 
{ 
    [super dealloc]; 
    //No longer need the object 
    [jsonArray release]; 
    NSLog(@"Ref count %i", [jsonArray retainCount]); 
} 

ログを呼び出す

+ (NSMutableArray *)parseSpecialtyResult:(NSString *)json 
{ 
    SBJsonParser *parser = [[SBJsonParser alloc] init]; 

    NSDictionary *dictionary = [parser objectWithString:json]; 

    NSArray *jsonObjects = [dictionary valueForKey:@"Rows"]; 

    NSMutableArray *jsonArray = [[NSMutableArray alloc] initWithCapacity:[jsonObjects count]]; 

    //Storing objects 
    for (NSDictionary *dict in jsonObjects) 
    { 
     Specialty *specialty = [[Specialty alloc] init]; 
     [specialty setName:[dict objectForKey:@"name"]]; 
     [specialty setIdenity:[dict objectForKey:@"id"]]; 

     [jsonArray addObject:specialty]; 
    } 

    [parser release]; 

    //Relinquish ownership of this object 
    return [jsonArray autorelease]; 
} 

Ref count 1 
+1

また、retainCountはこの種のものを見るのにかなり役に立たない方法です。ここでそれを検索すれば、それについてのbbumの話が頻繁に見られます。 (彼はAppleのどこで働いているのか知っておくべきです) –

+1

通常はretainCountは実際の情報を表示しません。あなたがチェックしたいのであれば、楽器を使ってメモリが増えていますか? Btwすることができます1)特殊なリリース、これはリークを作ることができます。 – Alex

+0

@Grant情報に感謝します。私はプロファイラでダブルチェックして、それが漏れていることを確認しました:( –

答えて

5

あなたはreleaありません保持している場合

self.jsonArray = [[SpecialtyUrl parseSpecialtyResult:responseString] retain]; 

それは、再び(単に次のようになります。jsonArrayが保持またはコピーする財産である場合、これはオブジェクトを保持上-、また

for (NSDictionary *dict in jsonObjects) 
{ 
    Specialty *specialty = [[Specialty alloc] init]; 
    ... 
    [jsonArray addObject:specialty]; 
    [specialty release]; 
} 

for文のSpecialityオブジェクトをSEまたはコピー):

self.jsonArray = [SpecialtyUrl parseSpecialtyResult:responseString]; 

また、[super dealloc];deallocで最後のステートメントでなければなりません。

+0

彼はまた '[SpecialtyUrl parseSpecialtyResult:responseString]'を保持しています。( 'jsonArray'が'(非原子的な、保持する) 'プロパティであると仮定して)彼はそれをすべきではありません。 – akashivskyy

+0

しかし、 NSMutableArray配列の内容は引き続き保持されています –

+0

私は否定しません – akashivskyy

0

あなたはこのラインにリークしている:

Specialty *specialty = [[Specialty alloc] init]; 

あなたは名物の束を作成していますが、それらを解放することはありません。

そして、この行では、selfを前面に使用してオブジェクトjsonArrayを上書きしています。

self.jsonArray = [[SpecialtyUrl parseSpecialtyResult:responseString] retain]; 

あなたはおそらくのようなあなたのjsonArrayプロパティを宣言したので:

@property(nonatomic,retain)... 

、その後、あなたはそれをsynthezied。それは、あなたが自己を使ってそれをおろすときにオブジェクトを保持するあなたのためのセッターを作成しました。

ので

self.jsonArray = [SpecialtyUrl parseSpecialtyResult:responseString]; 

で十分です。

self.jsonArray = [[SpecialtyUrl parseSpecialtyResult:responseString] retain]; 
                     ^
                    Right here! 

セッターはすでに適切に保持し、リリースする必要があります:jsonArrayを想定し

3

は、あなたが余分な保持を追加している、呼び出し元のクラスのretainプロパティです。だからそこに保持するだけでオブジェクトが漏れる。

他の回答も、特殊オブジェクトを解放する必要があります。しかし、特殊オブジェクトが入っている配列が上手くいくかぎり、リークは残っています。

0

ここでオブジェクトのオーナーシップを取ると、2つの保持メッセージが表示されることがあります。

//This class will take the responsibility of the object's ownership 
self.jsonArray = [[SpecialtyUrl parseSpecialtyResult:responseString] retain]; 

jsonArrayプロパティが(retain)または(nonatomic、retain)として宣言されている場合。単純にjsonArrayをプロパティに代入すると、retainが送信されます。あなたのコードを変更することができます:

> @property (nonatomic, retain) NSMutableArray *jsonArray; 
> 
> @synthesize jsonArray; 
> 
> self.jsonArray = [SpecialtyUrl parseSpecialtyResult:responseString]; 
関連する問題