iPhoneアプリの開発で起きるエラーについて

このQ&Aのポイント
  • NSMutableArrayを使用したiPhoneアプリの開発中に、sort部分でエラーがたまに発生します。エラーメッセージは"iphone incorrect checksum for freed object object was probably modified after being freed"です。
  • エラーが起きる原因としては、メモリを解放した後に書き換えている可能性があります。しかし、必ずしも発生するわけではなく、たまに起きるエラーです。
  • 解決策として、一度NSArray *sort = [NSArray array];というコードを試してみましたが、結果は変わりませんでした。また、エラーが発生するまでシミュレータを何度も起動する必要があり、手間がかかります。どのように解決すれば良いか、打開策を教えてください。
回答を見る
  • ベストアンサー

iPhoneアプリの開発についてです。

デバッグにはまったので質問させていただきました。 NSMutableArray *dateArr = [NSMutableArray array];      [  //メソッド     : ^ ( //引数 ) {           for ( ) { [dateArr addObject:○○○]; ]; NSArray *sort = [dateArr sortedArrayUsingSelector:@selector(compare:)];      ]};    上のようなコードでsort部分でたまにエラーが起こります。 iphone incorrect checksum for freed object object was probably modified after being freed 自分でも調べたのですが、私の認識ではメモリを解放した後に書き換えているといった感じです。 しかし、このような必ずではなくたまに発生するエラーをどう直せばいいのか分かりません。 一度 NSArray *sort = [NSArray array]; というコードを入れて見ましたが結果は変わらずでした。 またエラーが出るまで何度もシミュレータを起動しなければならないので大変です。 何か打開策はないでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • harawo
  • ベストアンサー率58% (3742/6450)
回答No.1

問題は、NSArrayのソートのメソッドにでなく、Blocks構文にあります。 Blocks構文を使う目的は、非同期処理にあります。提示なさったコードでは、Blocks構文が省略されていますが、いかにも数件では終わらず、数千件、数万件くり返しdateArrにaddObjectされるかのような印象ですね。そういういつ終わるかわからない処理は、Blocksに入れてしまって、主流の処理を続けてやってしまいましょう、みたいな意図で、Blocks構文を使うのが、本来の使い方です。 なので、Blocksの次の行「NSArray *sort = [dateArr sortedArrayUsingSelector:@selector(compare:)];」の変数dateArrがどのような内容になっているかは、だれも断定することができません。まったくの空かもしれないし、中途半端な要素数になっているかもしれません。まずaddObjectが完了している状態ではないでしょう。 ただ、エラーメッセージの意味するところは、Blocksの非同期処理とは関係ない気がします。なんとなく、Blocks外のdateArrと、Blocks内のdateArrが、同一でないのではないかと思います。ここらへんは私自身がBlocksをほとんど使ったことがないので、よりBlocksに詳しい回答者の出現を待ちたいと思います。

nylonraw999
質問者

お礼

ご指摘の通り、dateArrにnilのオブジェクトが入っていたようです。何度かテストしましたがたぶん解決したように思われます。 ありがとうございました。

その他の回答 (1)

回答No.2

質問のコードは、ブロック構文を使っている雰囲気はありますが、 カッコの対応もとれておらず意味不明です。 本当にこのように書いているのですか? iphone incorrect checksum for freed object object was probably modified after being freed のエラーについては、 http://pebble8888.hatenablog.com/entry/2014/03/24/214851 が参考になると思いますが、メモリを解放した後にその領域を書き換えたというよりも、 あるメモリ領域への書き込みを誤って別の関係ない解放済みメモリ領域まで書き換えた というケースが実は多いと思います。 つまりsortでエラーが起きたように見えますが、sortしている領域は 実は被害者で、別の全く関係ない処理が誤ってその領域を破壊した可能性 が高いと思います。 上記サイトでは、mallocで確保した領域の書き込みサイズを誤った例を とりあげていますが、mallocで確保した領域に限った話ではありません。 memsetのように領域のサイズを指定して処理してもらうような関数/メソッドを 使っている箇所があれば、そのサイズ指定が正しいかを徹底的に確認してみると よいと思います。

nylonraw999
質問者

お礼

プログラム部分のカッコの対応がずれているのは単純に私のタイプミスです。すみません。参考サイトまで教えていただきありがとうございます。

関連するQ&A

  • mallocについて

    mallocについて 現在C言語でプログラムをかいているのですが、原因不明のエラーが出て困っています。 それはmallocによる動的メモリ確保を行ったとき、 (float *)malloc(sizeof(float)*200)の場合大丈夫ですが、 (float *)malloc(sizeof(float)*320)ではエラーが出てしまうのです。 しかし (float **)malloc(sizeof(float*)*640)とした場合エラーは出ませんでした。 これは何が原因でエラーが出ているのでしょうか? ちなみにコンパイルはできており、実行したとき プログラム名(7637) malloc: *** error for object 0x100ff7a08: incorrect checksum for freed object - object was probably modified after being freed. *** set a breakpoint in malloc_error_break to debug というエラーがでます。

  • [再]objective-c 描画処理について

    前回質問させて頂きましたが、まだ抜け出せていないので教えて下さい。 ↓↓↓ -------------------------------------------------------------------------------------------------------------- 初心者ですが、iPhoneアプリを作成しています。 画像を並べてスクロールできるように配列で描画処理を行ないたいのですが、うまくいきません。 今のところのコードはこんな感じです↓ - (void)viewDidLoad { [super viewDidLoad]; NSMutableArray* imageList = [NSMutableArray array]; for (int i=1; i < 20; i++) { UIImage* image = [UIImage imageNamed: [NSString stringWithFormat:@"%d.jpg", i+1]]; [imageList addObject:image]; } MyImageView* imageView = [[MyImageView alloc] initWithImage:imageList]; scrollView.contentSize = imageView.bounds.size; [scrollView addSubview:imageView]; [imageView release]; } どなたか分かる方、教えて頂けますよう宜しくお願いします。 -------------------------------------------------------------------------------------------------------------- ↓ NSArray *initWithImage;と引数で渡しましたが、 「MyImageView* imageView = [[MyImageView alloc] initWithImage:imageList];」 の部分で、「Incompatible pointer sending 'NSMutableArray *' to parameter of type 'UIImage *'」とエラー表示され、実行すると、 「Tread1 : Program received signal: "SIGABRT"」で落ちてしまいます。

  • Objective-C for文でのインスタンス

    既出の質問と類似してますが、解決しないので質問します。 Objective-CのNSMutableArrayを使いラベルを複数個作りならべたいのですが、 変数iを使ってラベルに番号をつける方法がわかりません。 今のコードは NSMutableArray *tiles = [NSMutableArray array]; for( int i=0; i<25; i++ ){ UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(0,0, tileSize,tileSize)]; label.text=[NSString stringWithFormat:@"%d",i]; [tiles addObject:label]; [self.view addSubview:label]; } です。 これを UILabel *label%d,i = [[UILabel alloc]initWithFrame:CGRectMake(0,0, tileSize,tileSize)]; のようにして、 label0、lable1、label2、label3・・・・ というように生成するにはどうしたらいいですか? Objective-C初心者です。 よろしくお願いします。

  • objective-c 描画処理について

    初心者ですが、iPhoneアプリを作成しています。 画像を並べてスクロールできるように配列で描画処理を行ないたいのですが、うまくいきません。 今のところのコードはこんな感じです↓ - (void)viewDidLoad { [super viewDidLoad]; NSMutableArray* imageList = [NSMutableArray array]; for (int i=1; i < 20; i++) { UIImage* image = [UIImage imageNamed: [NSString stringWithFormat:@"%d.jpg", i+1]]; [imageList addObject:image]; } MyImageView* imageView = [[MyImageView alloc] initWithImage:imageList]; scrollView.contentSize = imageView.bounds.size; [scrollView addSubview:imageView]; [imageView release]; } どなたか分かる方、教えて頂けますよう宜しくお願いします。

  • StringクラスのcompareToメソッド

    ArrayListに登録した文字列を五十音順にソートしようと思いComparator を使用して 以下のようなサンプルプログラムを作ってみました。 ところが想定していたような {赤ちゃん、富士山、山口県}とはならず {富士山、山口県、赤ちゃん} というような結果になりました。 compare() の戻り値の部分を return ((String)arg1).compareTo((String)arg0); に変更しても{赤ちゃん、山口県、富士山} となり辞書の並びとは異なる結果になりました。 辞書順に並べるにはなにかよい方法はありますでしょうか。 public class compareTest { public static void main(String[] args) { ArrayList<String> array = new ArrayList<String>(); String a = "赤ちゃん"; String b = "山口県"; String c = "富士山"; array.add(a); array.add(b); array.add(c); for(int i=0;i<array.size();i++) { System.out.println("ソート前=" + array.get(i)); } Collections.sort(array, new testComp()); for(int i=0;i<array.size();i++) { System.out.println("ソート後=" + array.get(i)); } } } public class testComp implements Comparator { public int compare(Object arg0, Object arg1) { return ((String)arg0).compareTo((String)arg1); } }

    • ベストアンサー
    • Java
  • 多次元配列のソートがうまくいかない

    多次元配列のソートがうまくいかない 質問失礼します. 以下のような,String型,int型,double型の混在した多次元配列([3][3]の配列)をソートするプログラムを作成しました. このプログラムでは3番目の項目でソートを行っています. 問題点なのですが, 3番目の項目がdouble型の一桁(例えばarray[1][2]が2.0)ならばうまくソートできるのですが, 一つを2桁(例えばarray[1][2]を10.0)にすると何故か先頭の数(10.0の場合1)を基準にソートされてしまっているようです・・・ 配列へのデータの入れ方が間違っているのでしょうか? 原因がはっきりわからず困っているのですが, わかる方いましたらよろしくお願いします. public class Sort_test { /** * @param args */ public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ String[][] array = new String[3][3]; array[ 0 ][ 0 ] = "A"; array[ 0 ][ 1 ] = 2001+""; array[ 0 ][ 2 ] = 9.0+""; array[ 1 ][ 0 ] = "B"; array[ 1 ][ 1 ] = 1001+""; array[ 1 ][ 2 ] = 2.0+""; array[ 2 ][ 0 ] = "C"; array[ 2 ][ 1 ] = 3001+""; array[ 2 ][ 2 ] = 6.0+""; TheComparator comparator = new TheComparator(); // 3番目の項目でソートするように設定 comparator.setIndex( 2 ); // ソート実施 Arrays.sort( array, comparator ); dump(array); } public static void dump( String[][] array ) { for ( int i = 0;i < array.length;i++ ) { for ( int j = 0; j < array[ i ].length;j++ ) { System.out.print( "\t" + array[ i ][ j ] ); } System.out.println(); } } } //多次元配列ソート用クラス class TheComparator implements Comparator { /** ソート対象のカラムの位置 */ private int index = 0; /** ソートするためのカラム位置をセット */ public void setIndex( int index ) { this.index = index; } public int compare( Object a, Object b ) { String[] strA = ( String[] ) a; String[] strB = ( String[] ) b; return ( strA[ index ].compareTo( strB[ index ] ) ); } }

    • ベストアンサー
    • Java
  • Array.sortメソッドのデフォルト比較関数

    JavaScriptのArray.sortメソッドは、 引数を指定しなければデフォルトの比較関数でソートされますが、 この比較関数を取り出して利用できないでしょうか。 要件は、プロパティ[name]と[value]を持ったオブジェクトの配列のソートです。 nameプロパティは半角英数字の文字列で、これをキーにソートしたいと考えています。 ソートの基準は、Array.sortのデフォルトと同じです。 つまり、こんなコードを想定しています。 var ary = [o1, o2, o3]; // o1~o3はそれぞれ上記のオブジェクト ary.sort(function(a, b){ return compare(a.name, b.name); }); このコードにおけるcompare関数を、Array.sortのデフォルト比較関数にしたいのですが、 これは自前で作成するしかないのでしょうか。 数値だけでなく文字列全般の比較になるので、結構実装が面倒そうなのですが、 自作する場合に何か使えそうな標準関数等、無いでしょうか。 今のところ思いついているのは、下記みたいなものです。 var compare = function(a, b) {  var temp = [a, b];  temp = temp.sort();  return temp[0] === a ? -1 : 1; } 比較関数内で更にArray.sortを呼んで2項目をソートし、 順番が入れ替わったかどうかを判定するだけです。 何だか冗長で気持ち悪いコードですので、代案を探しています。

  • 基礎的な質問ですが

    以下のコードを見てください。 class Sort { public Sort() { int[] array = new int[10]; for(int i=0;i<10;i++) { array[i] = i; } } public void HeadPrint() { System.out.println(this.array[0]); } } 最初のSortで0~9の数字を含むarrayを作って、 HeadPrint内で、arrayの最初の要素にアクセスしてその値を 表示したいのですが、 this.array[0]ではエラーが発生します。 何が悪いのでしょうか? アドバイスよろしくお願いします

    • ベストアンサー
    • Java
  • STLのsortで、プライベート変数を比較関数に組み入れたい。

    STLのsortで、プライベート変数を比較関数に組み入れたい。 STLのvectorのsortで比較関数を指定してソートをしようとしております。 ソートしようとするvectorは、とあるクラスのプライベート変数であり、 同じクラスの他のプライベート変数を利用した比較を行おうとしています。 例えば int array[4] = {1, 7, 3, 5}; なるプライベート変数があり、比較関数はこんなアルゴリズムとしたいと。 bool compare(int left, int right) { return array[ left ] < array[ right ]; } この compare をクラスのメソッドとして定義して使えるのかなと思っていたのですが コンパイルしたところエラーが出ました。パブリック変数にして、プレディケートの ためのクラスを作って、そこでパブリックメソッドを作って……という方法は見つかった のですが、そのような面倒な方法を経なければいけないのでしょうか。

  • この警告はどうすれば?

    以下のメソッドを含むプログラムをEclipseで作成している際に次のような警告が発生しました。 型の安全性:型Comparator の式は、未検査の型変換を使用してComparator<? super T>に準拠するようにする必要があります。 型の安全性:型 Arrays の総称メソッド sort(T[], Comparator<? super T>)の未検査の呼び出し sort(Object[],Comparator)がありました。 コンパイルして実行する分には、なんら問題ないのですが、この警告の意味と解決策が分からないままにしておくのは気持ち悪いので、分かる方がいらしたら教えてください。 static void sortName(){  String array[] = new String[4];  array[0] = "abba";  array[1] = "abab";  array[2] = "aaaa";  array[3] = "aabb";  Comparator asc = new Comparator() {   public int compare(Object obj0, Object obj1) {    String nameKana0 = (String)obj0;    String nameKana1 = (String)obj1;    int ret = 0;    ret = nameKana0.compareTo(nameKana1);    return ret;  }  };  Comparator comparator = asc;  Arrays.sort(array, comparator); // 配列をソート  for (int i = 0; i < array.length; i++)   System.out.println(array[i]); }

    • ベストアンサー
    • Java

専門家に質問してみよう