二重開放があると強制終了が起こる。

すなわち、

1.定義の際にautoreleaseを送っているにもかかわらず、
メソッドの最後でreleaseを送ったとき。

2.定義の際、initでない(string~,array~)など、
autoreleaseと同じ意味を持つメソッドを送っているにもかかわらず、最後でreleaseを送ったとき。
タイトルのようなエラーが出たら、すなわち

整数とポインタ型の変数を比較してるので、
比較ができません!

という意味。
ポインタ型になってる変数を、
非ポインタ型の変数に代入してやってから実行するとうまくいきます。
特に、配列の要素はポインタ型の変数になっています。
配列内の要素を使う際は気をつけましょう。

○エラーが出る例
配列ary(要素は1,2,3,4という整数だとする)

NSInteger i = [ary objectAtIndex:0];
if(i > 0){
....
}

とすると、comparison between pointer and integer
のエラーが出る。

配列内では、整数型、ブール型などはすべてNSNumber型に変換されている。
(というか、変換してから入れなければならない。)
NSNumber型はポインタ型変数であるため、
NSInteger型である普通の整数と比較するためには、
NSNumber型をNSInteger型に変換しなくてはならない。

●修正した例
配列ary(要素は1,2,3,4という整数だとする)

NSInteger i = [[ary objectAtIndex:0] integerValue];

if(i > 0){
....
}


integerValueでNSInteger型に変換している。
もし配列内にブール型変数が格納されているなら、

boolValueメソッドで同様の処理が必要になる。
NSIntegerは*をつけない!

NSInteger integer = 3;

NSNumberは*をつける!

NSNumber *number = 3

これしないとエラー。