如何在 for 循环中将名为 obj1, obj2, obj3, ... 的对象添加到 NSMutableArray

How to add objects named obj1, obj2, obj3, ... to NSMutableArray in for loop

有没有更好的办法
_studentArray = [[NSMutableArray alloc] initWithObjects:student0, student1, student2, student3, student4, student5, student6, student7, student8, student9, student10, student11, student12, student13, student14, student15, student16, student17, student18, student19, nil];

使用 FOR 循环?

取决于您一次从何处获得多少对象的来源

如果您一次性获得所有对象,您可以按上述方式添加或使用 for 循环添加单个对象。

如果您一次获取一个对象,请添加它并添加其他对象。

很简单,你只需要开始for循环就可以了。

for(int i=0;i<20;i++) { 
    NSString *obj = [[NSString alloc]init];
    [_studentArray addObject:obj]; 
}

这取决于学生对象的来源、创建方式等。但我认为您应该重新考虑您的代码,不要像您那样为每个学生提供参考。试想一下,如果 facebook 也像您一样引用每个用户,那会有多难?

如果您自己创建学生对象,请尝试这样的方法:

- (void)viewDidLoad {


    _studentArray = [NSMutableArray new];

    for (int i = 0; i < 20; i++) {

        Student *student = [[Student alloc] init];
        [_studentArray addObject:student];
    }

    //At this point you will have the same that you did.

    //To access the 2nd student for example, you could do
    Student *theSecond = _studentArray[1]; //(because array index starts from 0)
    theSecond.name = @"Peter";
}

或者如果您想同时创建和添加到 _studentsArray

- (void)viewDidLoad {

    _studentArray = [NSMutableArray new];

    [self registerStudentWithName:@"Peter"];
    [self registerStudentWithName:@"John"];
    //and so on...

    Student *firstStudent = _studentArray[0];
    NSLog(@"%@", firstStudent.name); //Prints Peter
}

- (void)registerStudentWithName:(NSString *)name {

    Student *student = [[Student alloc] init];
    student.name = name;
    [_studentArray addObject:student];
}

正如其他人所指出的,最好不要首先在唯一命名的变量(student0、student1、student2 等)中创建 20 个不同的对象。正如其他人指出的那样,最好首先在数组中创建它们。

如果您必须处理大量这样的实例变量,您应该能够使用 valueForKey 找到它们:

_studentArray = [NSMutableArray arrayWithCapacity: 20];
for (int i=0; i< 20; i++)
{
  NSString *keyName = [NSString stringWithFormat: @"student%d", i];
  id aStudentVar = [self objectForKey: keyName];
  _studentArray[i] = aStudentVar;
}

我还没有对此进行测试,但它应该可以工作。不过,再次强调,拥有那么多按顺序命名的实例变量是一个糟糕的“code smell”。几乎可以肯定,无论您正在做什么,都有更好的方法。