所以我有一系列学生姓名。我正在运行测试数据所以我要经历一个循环分配和初始化每个学生,然后把它扔进stuArr
- 如果我NSLog我的Student.h
init()方法,它会给我我的名字我会期待,但当我尝试在我的方法之外调用它时,我得到空值:
- (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文件,但一切似乎都很好。
答案 0 :(得分: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];
}
答案 1 :(得分: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
的副本,只是将对象添加到最后。