1

私は次の方法を持っています:

-(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) でエラーが発生します。デバッガーによると、+[NSArray arrayWithObjects] 組み込みコンストラクター内の CFRetain でエラーが発生します。

さらに、行 (A) をコメントアウトし、for(...) ループをコメントアウトすると、コードはメソッドを実行します。

これは私にとって非常に予想外です。行(B)で何が間違っていますか?そして、行 (A) で完全に異なる配列を作成すると、メソッドが実行されるのはなぜでしょうか? for(...) ループをコメントアウトすると、その前にある行 (B) のエラーが防止されるのはなぜですか?

誰かがこれがなぜなのか説明できますか? または、少なくともデバッグに関するアドバイスをください。メソッドが 1 回だけ実行され、「self」が有効であることは既に確認済みです。

4

2 に答える 2

3

簡易メソッドarrayWithObjectsを使用する場合、最後の要素として nil を指定する必要があります。

ドキュメントには次のように記載されています。

配列とオブジェクト:

引数リスト内のオブジェクトを含む配列を作成して返します。

+ (id)arrayWithObjects: (id)firstObj, ...

パラメーター

firstObj, ...
nil で終わるオブジェクトのコンマ区切りリスト。

于 2009-08-06T06:12:31.703 に答える