2011-10-31 3 views
0

iOSアプリケーションを終了してメモリリークを取り除いているので、 値を割り当てている間に機器がリークしていることがわかりました。NSDictionaryのメモリリークで値を割り当て中

.hファイルでは、プロパティ(nonatomic、retain)でNSdictionaryのfeedDataを宣言しました。

私はNSdictionaryを後退させるもう一つのクラスWebServiceControllerを持っています。

ここに私のコードです。 .mファイルで

if ([nid rangeOfString:@","].location == NSNotFound) 
{ 

    NSArray *data = [[NSArray alloc]initWithObjects:nid,[NSNumber numberWithInt:0],[NSNumber numberWithInt:0],delegate1.myCity,nil]; 
    WebServiceController *wsct=[[WebServiceController alloc]init]; 
    wsct.delegate=[[UIApplication sharedApplication]delegate]; 
    feedData=[wsct getTimelineFeed:data]; 
    NSLog(@"feed data is--->%@",feedData); 
    [wsct release]; 

} 

コード "feedData = [getTimelineFeed wsct:データ];"メモリリークを起こしています。

ここではNSDictionaryを返す関数です。

- (NSDictionaryの*)MyTimelineFeed:(にNSArray *)データ

{

if(![delegate sessionId]) return nil;  

XMLRPCRequest *request = [[XMLRPCRequest alloc] initWithHost:[NSURL URLWithString:ENDPOINT]]; 





NSMutableArray * postParams = [NSMutableArray array]; 

NSString * method = [NSString stringWithFormat:@"timeline.getFeedItems"]; 

[postParams addObject:[delegate sessionId] ]; 





for (int i = 0; i < [data count]; i++) { 

    [postParams addObject:[data objectAtIndex:i]]; 

} 



[request setMethod:method withObject:postParams]; 

XMLRPCResponse *nodeSaveResponse = [XMLRPCConnection sendSynchronousXMLRPCRequest:request]; 


[request release]; 


if([nodeSaveResponse isKindOfClass:[NSError class]]) 

    return nil; 


NSMutableDictionary * dict = [nodeSaveResponse object]; 

if ([dict isKindOfClass:[NSError class]]) { 
    //NSLog(@"Error found"); 
    return nil; 
} 

return dict; 

}

PLSヘルプ。

+0

WebServiceControllerは、作成したクラスですか?質問にgetTimelineFeedの実装を含めることができますか? – jrturton

+0

私の編集でこの機能を追加しました。 –

答えて

2

私はこの方法であると仮定しています:

feedData=[wsct getTimelineFeed:data]; 

で始まるココアメソッドのみのためのメモリ管理規則に従っているので、ケースすべきではない1のretain数、とNSDictionaryのを返してnewまたはallocまたはcopyは1

retain数を持つオブジェクトを返す必要があります含まれていたが、これにあなたの方法を変更します。

newTimelineFeed 

そして、あなたが行を変更することができます:)

+0

なぜ関数名を変更する必要があるのですか?私がMyTimelineFeedに変更した場合、その関数によって返されたNSDictionaryがfeedDataオブジェクトによって保存されるため、私はすでにそのプロパティを宣言しています(nonatomic、retain)。 –

+0

@AjeetPratapMauryaこれは、メソッドが保持されたオブジェクトを返す場合、Cocoaのメモリ管理ルールはその方法で名前を付ける必要があることを示しているからです。さらに、あなたのプロパティfeedDataはあなたがsetterを介してではなくivarに直接アクセスしていますが、setterを使うためにはself.feedData = newDataを使う必要があります。 –

-2

行ってもいいようになりますと

feedData = [wsct getTimelineFeed:data]; 

feedData = [[wsct getTimelineDeed:data] retain]; 

ちょうどそれが不要になったときfeedDataを解放しないことを忘れないでください。私は、コードの残りの部分で任意のリークを見たが、前への参照を失うためにここに可能性があることはできませんあなたがラインに

self.feedData =[wsct getTimelineFeed:data]; 

ない

feedData =[wsct getTimelineFeed:data]; 

を使用する必要があります

+0

「非常に正しい」答えは、使用を検討していたと思います。 [self.feedData release]; self.feedData = [wsct getTimelineFeed:data]; [data release];プロパティとしての は、retainとして定義されています。 また、deallocクラス –

+1

@SebastienThuilliezの間にfeedData値を解放することを忘れないでください。いいえ、それは「非常に正しい」ものではありません。優秀な議論については、http://stackoverflow.com/questions/7262268/why-shouldnt-i-use-the-getter-to-release-a-property-in-objective-c/7262360#7262360を参照してください。 – jrturton

+1

余分なものはありませんメモリを止めません_leaks_ – jrturton

0

self.feedDataを使用すると、新しい値を保持する前にivarに保持されていた以前の値が解放され、ivarに値を割り当ててもこれは実行されません。

関連する問題