2012-03-25 2 views
0

私の最初のアプリケーションの終わりに近づいているImと私のエラーとメモリ管理を通過してすべてをクリーンアップしようとしています。 Xcodeでアナライザでアナライザーのメソッドからのメモリリーク

は、次の行は、「潜在的なメモリリーク」

- (NSMutableArray *) convertStringToASCIIMutableArray:(NSString *)stringIn { 
    NSLog(@"call:convertStringToASCIIMutableArray"); 

    NSMutableArray *arrayOut = [[NSMutableArray alloc] initWithCapacity:stringIn.length]; 
    //NSMutableArray *arrayOut = [NSMutableArray arrayWithCapacity:stringIn.length]; 

    for (int i=0; i<stringIn.length; i++) { 
     unichar ch = [stringIn characterAtIndex:i]; 
     if (ch > 96 && ch<123) ch = ch - 32; // convert to all capitals 
     [arrayOut insertObject:[NSNumber numberWithChar:ch] atIndex:i]; 
    } 
    return arrayOut; 
} 

として起動しますが、私は(コメント行のようにまたは自動解放で)アプリのクラッシュのalloc呼び出しを削除する場合。誰でもここで何が起こっているのか知っていますか?

+1

ARCを使用していますか? –

+0

ARCを使用しているかどうかを知ることは非常に重要です。 – Byron

答えて

0

さて、私didntのは本当にそれ自体が私の問題を解決するが、私は(私の注意にこの機能をもたらすためのARC、感謝@Kurt Revisと@Byron)新しい自動参照カウントをコンパイルする私のプロジェクト

を変換

私のプロジェクトを変換するには、編集>リファクタリング> Obj-C ARCに変換するだけでした。その後、リファクタリングウィンドウに表示された「チェック」を実行した後、プロンプトに従ってメモリ管理の新しいルールに従わなければなりませんでした。基本的に私はdeallocメソッドでいくつかのリリースを削除しなければなりませんでしたが、問題ナビゲータにいくつかの警告を出して何をすべきか教えてくれました。

ARCが優れているようです。詳細はこちら

Steffen Itterheim

0

マニュアル参照カウント環境にある場合、「arrayOut」は自動リリースされません。

return arrayOutからreturn [arrayOut autorelease]に変更すると、配列は現在のrunloopの最後に解放されます。

+0

これはうまくいきません。それはarrayOutがautoreleaseを何度も送信されたと言います。 – bkbeachlabs

+0

非ARCのベストプラクティスは、オートレリースされたオブジェクトを返すことです。受信したメソッドでautoreleaseを呼び出すのではありません。 – borrrden

0

ここには何も見えません。 「潜在的なリーク」は、alloc-initを使用して変更可能な配列を作成し、メソッドが完了したときに解放しないためです。オブジェクトを返すので、オートリリース版を作成することをお勧めします。

autoreleaseバージョンを使用しているときにアプリケーションがクラッシュすると、クラッシュする場所とクラッシュする場所を確認する必要があります。例外が発生したときにブレークポイントを設定することについて知っていますか?ない場合は、このに従い、コードがクラッシュが発生したときに、あなたがそれをデバッグすることができますラインで停止します:

  • 押してコマンド+ Xcodeで6
  • 左下隅にある+ボタンをクリックし
  • 例外ブレークポイントの追加を選択します。
  • 投げ捨てとヒット完了時にすべての例外のオプションを設定します。
+0

Iveは試行錯誤のデバッグにブレークポイントを使用しましたが、これはもっと強力な感謝のようです。私はこれを試してみる – bkbeachlabs

関連する問題