2011-12-04 5 views
0

これは、これまでの2つの質問から浮気しています。私はヒープショットを使ってApp Storeに提出する前に私の記憶がどうなっているのかを確認していますが、ユーザーがプログラムのループを完了するたびに3〜5KBずつ増加しています。私は抽選会に戻り、プログラムの大部分をコメントアウトし、徐々にセクションをオンラインに戻しました。私は問題の中心であると私が信じるものに絞り込むことができました。カスタムクラス+データベース呼び出しによりメモリが上昇しますか?

私は注意します:私はARCに変換しても同じ問題がありました。ここで(私が信じる)コードの関連分野です。

行クラス:

@interface Row : NSObject { 
int rowID; 
NSString *rowProblem; 
NSString *rowAnswer; 
int rowTimes_Right; 
int rowTimes_Wrong; 
Boolean marked; 
} 

@property (nonatomic) int rowID; 
@property (nonatomic, copy) NSString *rowProblem; 
@property (nonatomic, copy) NSString *rowAnswer; 
@property (nonatomic) int rowTimes_Wrong; 
@property (nonatomic) int rowTimes_Right; 
@property (nonatomic) Boolean marked; 

データベース機能(行を取得します):

-(Row *) getRow { 
Row *holder = [[[Row alloc] init] autorelease]; 

//Pick a random problem to give to the User 
int randomrow = (arc4random() % [self getNumberOfRows]) + 1; 



NSString *querysql = [NSString stringWithFormat:@"SELECT * FROM problems WHERE id = %d", randomrow]; 

const char *sql = [querysql UTF8String];  
sqlite3_stmt *statement; 

//Execute the Query 
if (sqlite3_prepare_v2(wordsDB, sql, -1, &statement, NULL) == SQLITE_OK) 
{ 

    while (sqlite3_step(statement) == SQLITE_ROW) 
    { 
     char *problem = (char *)sqlite3_column_text(statement, 1); 
     char *answer = (char *)sqlite3_column_text(statement, 2); 

     holder.rowID = sqlite3_column_int(statement, 0); 
     holder.rowProblem = [NSString stringWithUTF8String:problem]; 
     holder.rowAnswer = [NSString stringWithUTF8String:answer]; 
     holder.rowTimes_Right = sqlite3_column_int(statement, 3); 
     holder.rowTimes_Wrong = sqlite3_column_int(statement, 4); 
     holder.marked = sqlite3_column_int(statement, 5); 

    } 

    sqlite3_finalize(statement); 
} 
else 
{ 
    NSLog(@"SQL Error Message: %s", sqlite3_errmsg(wordsDB)); 
} 

return holder; 
} 

ビューで一緒にそれをすべてを結びつける:

-(void)setToWord{ 
[currentRow release]; 
currentRow = [[dataB getRow] retain]; 

[problemLabel setText:currentRow.rowProblem]; 
[definitionLabel setText:currentRow.rowAnswer]; 
} 

任意の考えをいただければ幸いです。

+0

確かにヒープショットで何が増えていますか? – hooleyhoop

+0

@hooleyhoopそれは、以前の質問(コールスタックのポストを含む)の特定の部分について尋ねましたが、誰もそれを解読できませんでした。 – ballofpopculture

答えて

0

約5KBの漏れは心配ありません。 Apple自身のCocoaルーチンはこの程度まで漏れており、Appleは明らかにそれについて心配していません。たとえば、View Controllerをナビゲーションコントローラにプッシュしてから、もう一度ポップアップすると、インストゥルメントはすべてのオブジェクトが正しく破棄されていることを示していますが、深い内部から明らかにわずかなリークがありますココア。各ヒープショットに残されたオブジェクトを生成するコードが自分のコードであるかどうかは、Instrumentsを使用して非常にはっきりとわかるはずです。 getRowメソッドのインテリアを@autoreleasepool{}にラップしてみることもできますが、違いはありません。

+0

私のプログラムを提出すれば、リンゴはこれについて心配しないだろうか?リークは何も見つかりませんでしたが、アナライザーもどちらもありませんでしたが、私は彼らが裏目が漏れて、いいえと言うことを心配していました。 – ballofpopculture

+0

私は上記のアプリを提出したが問題はなかった。 - 実際には、これを試してみてください。 Xcodeの組み込みユーティリティアプリケーションテンプレートからアプリを作成し、それをInstrumentsで実行します。モーダルビューに戻って戻ったときに何が起こるかを示すヒープショットを実行します。あなたは約6KBの小さな漏れを見るでしょう。 Appleのコードはこのようなものでいっぱいです。 5KBのゴーラウンドは*小さい*!私たちはGBの世界に住んでいます。 – matt

+0

アップルはあなたのアプリを拒否しません。メモリリークが発生すると、最終的にはあなたのアプリが殺されるため、修正するのは良いことです。どのくらいの速さでメモリをリークするか、実際にタスクを実行するために使用するメモリの量によって決まります。ところで、漏れは、メモリが漏れていることを示していますか?そうでなければ、メモリ警告で解放される可能性のあるキャッシュされたオブジェクトになる可能性があります。 – Stripes

0

[OK]を、それはしばしば失神です。両方の以前の質問では、詳細なスタックトレースを投稿します。これはインストゥルメンタルがあなたに見せてくれる面白いものの1つです。

プログラム内の任意のポイントを選択します。実行時にメモリを使用します。これはスタックであり、インストルメントが必要ではありません。

インストゥルメントでは、アプリ内のすべてのライブオブジェクトの数を表示できます。ヒープショットからヒープショットまでの数が増えている必要はありますか?技術的にはどこからでも到達可能であるため、あなたが破壊されたと思われるオブジェクトを誤ってぶら下げたり、漏れたりすることはありません。もし漏れているオブジェクトが見つかったり、存在してはいけないのであれば、それを作成した行のスタックトレースではなく、重要なのはなぜでしょうか?どこから解放したり、解放したのを忘れましたか?インストゥルメントは各オブジェクトの履歴を表示しますので、プロパティの保持とクリーンアップのバランスを取っていない箇所を解決できます。

これは単なる基本的な楽器です。実際には、簡単に拾ってもらえます。

脇見として。フレームワークではリークが発生することはほとんどありませんが、Leaksで明らかになるバグは、いくつかのフレームワークで深刻なリークが発生するバグであることがはっきりしています。

関連する問題