1

所以我有一系列学生姓名。我正在运行测试数据,所以我正在通过一个循环分配和初始化每个学生,然后把它扔进去stuArr- 如果我 NSLog 我的Student.hinit() 方法它会给我我期望的名字但是当我尝试在外面打电话给他们我的方法得到空值:

- (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

我猜你应该在这一行之前分配 + 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]);
    }
}

最后stuArrsomeArr只是将对象添加到末尾的副本。

于 2013-02-20T21:11:33.020 回答