有更好的方法吗?
_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循环?
答案 0 :(得分:1)
正如其他人所指出的那样,最好不要首先在唯一命名的变量(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;
}
我还没有对此进行测试,但它应该可行。但是,再次,拥有那么多顺序命名的实例变量是一个坏的&#34; code smell&#34;。几乎可以肯定,有更好的方法来做你正在做的事情。
答案 1 :(得分:0)
取决于来自何时以及何时获得多少物体的来源
如果您正在获取所有对象,您可以像上面一样添加或使用for循环添加单个对象。
如果您一次获得一个对象,请添加它并添加其他对象。
答案 2 :(得分:0)
这取决于学生对象的来源,创建方式等等。但我认为你应该重新考虑你的代码,不要像你那样为每个学生提供参考。试想一下,如果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];
}
答案 3 :(得分:-1)
它非常简单,你所要做的就是为一些计数开始循环。
for(int i=0;i<20;i++) {
NSString *obj = [[NSString alloc]init];
[_studentArray addObject:obj];
}