2009-06-06 14 views
0

私は非常に基本的なTwitterアプリを作成しています(iTunes上のスタンフォードiPhoneコースからのプレゼンス2です)、アプリケーションが漏れていないかどうかを確認したいと思ったとき。だから私はリークスを実行し、それはバットから右に1つを見つけた。しかし、スタックトレースを見ると、UIApplicationMainを呼び出すとmain関数でリークが発生するようです。iPhoneのメモリリークが制御外になっている

以下の図は、計測器のスタックトレースとxcodeの対応するコードを示しています。誰もがこの漏れを止めることができ、どうしてそれが起こっているのか知っていますか?

alt text http://img193.imageshack.us/img193/1237/picture2fnj.png

編集:[OK]を私は検索し、検索して、問題がどこにあるかになったが、私はまだ何が起こっているのかわかりませんしました。私は問題を抱えているTableViewControllerのソースを含めました。

[名前objectAtIndex:indexPath.row]にcell.textを設定すると、リークが発生します。興味深いのは、何とか漏れているように見えるNSIndexPathだということです。 objectAtIndexメソッドを使用してメモリをどのように管理する必要がありますか?

関連のないトピックで、私の質問を編集して返信する最善の方法を投稿していますか?またはコメントに自分のコードを投稿する必要がありますか?

@implementation PersonListTableViewController 


- (id)initWithStyle:(UITableViewStyle)style 
{ 
    if (self = [super initWithStyle:style]) 
    { 
    NSString *path = [[NSBundle mainBundle] pathForResource:@"TwitterUsers" ofType:@"plist"]; 
    names = [[NSArray alloc] initWithContentsOfFile:path]; 
    } 
    return self; 
} 


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return 0; 
    //return [names count]; 
} 


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease]; 
    } 

    cell.text = [names objectAtIndex:indexPath.row]; 

    return cell; 
} 

- (UITableViewCellAccessoryType)tableView:(UITableView *)table accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath 
{ 
    return UITableViewCellAccessoryDisclosureIndicator; 
} 


- (void)dealloc { 
    [names release]; 
    [super dealloc]; 
} 


@end 
+0

一般にコメントにコードを投稿しないでください。それは書式を破棄します。投稿を編集するのが適切です。 –

+0

リークの兆候は実際に起こる場所ではありません。メモリが割り当てられた場所です。リークが実際に発生したとき(つまり、オブジェクトへの最後のポインタがなくなった時点)を簡単に発見する方法はありません。 –

答えて

1

デバイスまたはシミュレータでツールを実行していますか?私は、メモリの問題が2つの間で異なる可能性があることを発見しました。

+0

私はシミュレータ上で実行しています。まだ電話をかけていない。 – Meroon

+0

携帯電話をお試しください。いくつかの洞察を提供することができます。 – Nosredna

+0

電話を試しても漏れはありません。ありがとう、相棒!!しかし、これはなぜシミュレータが漏れているのかということについて新しい質問を生み出しますが、電話機自体はそうではありません。奇妙な。 – Meroon

0

アプリケーションコードに漏れているものがあります。 UIApplicationMain関数はスタックトレースのエントリポイントです。コールをアプリケーションコードに追従させると、リークが検出されます。

漏洩していると思われる方法を特定できる場合は、そのコードを投稿してください。誰かが助けてくれるかもしれません。

0

基本的なことから始めよう。ロードされた最初のオブジェクトのすべてのUIコントロールとビジネスオブジェクトを解放していることを確認します。正常化中のすべてのリソースが適切にリリースされていることを確認してから、正しくインストールするようにしてください。あなたは、あなたの心の中でコードものの何もないが、ステップ場合

Finnally
UIButton *btn = [[UIButton alloc] init]; //not really complete... 
myObj.myButton = btn; 
[btn release] 

?:のようなパターンを使用し、何かがallocされているときに識別し、それが解放されていることを正確なポイントを識別しています。 releaseがどこにあるのかわからない場合は、おそらくあなたのメモリリークが見つかりました。解決策を見つけて再テストする。すべてのリークを特定するのに時間がかかります。私はいつも、それが解決されるまで、あるいは複数のソースがあると仮定します。

Andyさんのように、より直接的なヘルプが必要な場合は、より多くのコードを投稿する必要があります。

関連する問題