1

だから私は学生の名前の配列を持っています。私はテストデータを実行しているので、各学生を割り当てて初期化し、それをスローするループを通過していますstuArr-NSLog my Student.hinit() メソッドを使用すると、予想される名前が返されますが、外部でそれらを呼び出そうとすると私のメソッドの私はnull値を取得します:

- (void)viewDidLoad
{
    [super viewDidLoad];
    for (int i = 0; i < 5; i++) {
        stuArr = [stuArr arrayByAddingObject:[[Student alloc] init]];
        id test = [stuArr objectAtIndexedSubscript:i];
        NSLog(@"%@", [test stuName]);
    }
}

ここで重要な何かが欠けていますか?必要に応じて Student.m ファイルを挿入できますが、すべて問題ないようです。

4

2 に答える 2

5

この行の前に alloc + init stuArr を割り当てる必要があると思います。

stuArr = [stuArr arrayByAddingObject:[[Student alloc] init]]; 

または、次のようなことを試してください。

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSMutableArray *mutStudentsArray = [NSMutableArray array];

    for (int i = 0; i < 5; i++)
    {
        [mutStudentsArray addObject:[[Student alloc] init]];
        id test = [mutStudentsArray objectAtIndex:i];
        NSLog(@"%@", [test stuName]);
    }

    stuArr = [NSArray arrayWithArray:mutStudentsArray];
}
于 2013-02-20T20:31:27.053 に答える
1

tikhop の言うとおりです。for ループで配列を埋める場合は、埋める前に NSMutableArray (ループ内で配列を変更しているため可変配列) を初期化する必要があります。ループ内で、オブジェクトを配列に追加します[array addObject:id]

[array arrayByAddingObject:id]受信配列のコピーを作成し、新しいオブジェクトを最後に追加します。これは、次のようなことをする必要があることを意味します (for ループでそれを行うのはあまり意味がありませんが、理解するのに役立つかもしれません):

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSArray *stuArr = [NSArray alloc] init]; //stuArr can be used now

    for (int i = 0; i < 5; i++) {
        //someCopiedArr is some existing array- arrayByAddingObject will copy someArr and add an object
        stuArr = [someArr arrayByAddingObject:[[Student alloc] init]];
        id test = [stuArr objectAtIndexedSubscript:i];
        NSLog(@"%@", [test stuName]);
    }
}

最終的には、オブジェクトが最後に追加されただけstuArrのコピーになります。someArr

于 2013-02-20T21:11:33.020 に答える