予期せぬEXC_BAD_ACCESS、Objective-C
-
11-09-2019 - |
質問
私は、以下の方法:
-(void)testAPIModule {
self.requests = [NSMutableArray array];
NSLog(@"making arrays");
/*(A)*/ id array1 = [NSArray arrayWithObjects:[NSNumber numberWithInt:1], [NSNumber numberWithFloat:2], nil];
/*(B)*/ id array2 = [NSArray arrayWithObjects:[NSNumber numberWithInt:4], [NSNumber numberWithInt:5]];
NSLog(@"made array=%@",array2);
for( ServerRequest *req in self.requests ) {
[Networker sendRequest:req withDelegate:self];
[req release];
}
}
このコードが実行されます。
しかし、私がコメントアウトライン(A)または削除す"と、nil"を、これまでの取得 EXC_BAD_ACCESS
エラーがライン(B)!によるデバッガ、エラーが発生しCFRetainの+[NSArray arrayWithObjects]内蔵のコンストラクタです。
まだコメントアウトライン(A)とコメントのために(...)は、ループコードは実行を通じての研究"に関するお問合せ
これは非常に想定外。何してるわけではありませんので間違った線路(B)?とかを全く異なる配列にライン(A)の方法を実行すか?というコメントのために(...)ループ防止のためエラーライン(B)と前です。
できる人にその理由を説明です。少なくとも)の括弧の中身は研究者のためのデバッグ?しかし、私は証明された方法のみに走り回る"自己"が有効になります。
解決
使用時に便利なメソッド arrayWithObjects, ばnilを指定して最後の要素となります。
書類"と言ってい
arrayWithObjects:
を作成し、返します配列を含むオブジェクト引数リスト。
+ (id)arrayWithObjects: (id)firstObj, ...パラメータ
firstObj,...
カンマで区切られたリストのオブジェ終無料。
他のヒント
あなたの他の警告フラグに-Wformatを追加し、コンパイラはあなたのために不足しているnilをピックアップします。
要素がすべてのスタック上の同じ位置にあるので、二つ目は最初の後に動作します。だから、最初の1からの復帰後、スタックはまだ[NSNumber numberWithInt:1]
へのポインタ、[NSNumber numberWithFloat:2]
へのポインタとnilを含んでいる(と自動解放プールがまだ排出されていないので、これらのポインタでもまだ有効です!)。 2番目の1を呼び出すと、nilをせずに、それはスタック上のポインタを置き換えますが、ゼロは変更されません。 2番目の試みは、3つの数字を持っていた場合、それはおそらく同じようにクラッシュしました3番目の数字は次だったものは何でもその後、nilを上書きしているであろうから、残されることになる。