昨日、私はメモリ管理やシングルトン(Proper Management Of A Singleton Data Store In IOS With Web Service)についての質問をassked。私はこの問題を追跡しようとしている過去36時間の私の脳をラッキングされているとのNSLogなどとの広範なテストの後、私はブロック内に割り当てられたオブジェクトが自動解放されていないことだけで結論付けることができます。私は非同期Webサービスの応答を処理する方法としてブロックを使用しました。また、Webサービスの応答に基づいて任意のアクションを実行できるように、Webサービス要求を行う必要のあるビューコントローラからブロックを送信します。私のコードの包括的な概観は、溶液を得るのを助けることを期待して、私はここでの問題が発生しているすべてのコードを入れている:ブロックとメモリ管理
最初のステップは、私のルートビューコントローラからの要求を行っています。ロードすると、私はすべてのユーザーの「Hollers」に、私が本質的にイベントを意味するために使用している用語を要求します。ルートビューコントローラの負荷が、私は次のコードが含まれているメソッドを呼び出すと:
HollerWebService *api = [[HollerWebService alloc]init];
//NSLog(@"About to get the hollers for userId: %@", [[[CurrentSession defaultStore]currentUser]userId]);
[api getLatestHollers:[[[CurrentSession defaultStore]currentUser]userId] completionBlock:^(BOOL succeeded) {
//If the user has 0 hollers, display one of the illustrations
[self.tableView reloadData];
[self stopLoading];
if(!succeeded){
UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Could not connect to Holler" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[av show];
[av release];
}
else
{
for(Holler *hN in [[HollerStore defaultStore] allHollers])
{
//Retain count of all the hollers is
NSLog(@"Retain count of the holler is %i", [hN retainCount]);
}
}
}];
[api release];
あなたが見ることができるように、私は私のデバッグプロセスの一部であったのNSLogへのカウントを保持して出力し、コメントエリアを持っています。この時点では、各オブジェクトの保持カウントが2であることを示しています。つまり、次のコードセットで生成された元のホラーはまだオートリリースされていません。次のコードセットは私の実際のWebサービスの中にあります。私は増加したカウントを保持が得られている。この方法の重要な部分の周りのコメントが含まれている:1、保持カウントは2のままである。この時点で
- (void)getLatestHollers: (NSString *)userId completionBlock:(void (^)(BOOL succeeded))handler
{
[self getRequest:[[NSString alloc]initWithFormat:@"hollers/feed?user_id=%@",userId] completionBlock:^(NSData *receivedData, NSURLResponse *receivedResponse, NSError *error) {
if(error == nil)
{
SBJsonParser *json = [SBJsonParser new];
NSArray *response = [json objectWithData:receivedData];
[json release];
//NSLog(@"Got the latest Hollers. %@", response);
HollerStore *hStore = [HollerStore defaultStore];
for(NSDictionary *holler in response)
{
//At this point Holler *h is being sent an autoreleased holler
//from the parseHoller: method. At this point it's retain count is 1
Holler *h = [self parseHoller:holler];
[hStore addHoller:h];
//Now that I've added it to my singleton the retain count is 2, although I'm
//assuming the autorelease pool will eventually come through and reduce this
//to 1 but it never happens
}
handler(YES);
}
else
{
NSLog(@"The API failed :(, %@", [error localizedDescription]);
//Let the requestor know that this request failed
handler(NO);
}
}];
}
をしないので、私は私のシングルトンからオブジェクトを削除するに行くときメモリリークが発生します。私が結論づけることができるのは、私はある種のブロック関連のメモリ問題があるということだけです。誰かが何らかの洞察力を提供できるなら、それは非常に高く評価されるだろう!
さて私は、リークのツールを使用しましたし、それは少し洞察力を提供しています。 retaincountについては、昨日この機能を使ってバグを見つけました。 –
'retainCount'は役に立たない。常に良い方法があります。 – bbum
bbumは信じられないほど役に立つコメントに感謝します:) –