您将如何在目标 c 中动态创建类实例
Posted
技术标签:
【中文标题】您将如何在目标 c 中动态创建类实例【英文标题】:How would you dynamically create class instances in objective c 【发布时间】:2012-06-25 00:13:11 【问题描述】:我不确定我是否使用了错误的词汇来搜索此内容,但我无法找到任何与我正在尝试做的事情相关的内容。
我有一个课程是为了输入费用。我有 Name、amount 和 dueDate 成员变量。我正在使用命令行工具来创建这个类并对其进行测试。我的问题是,当用户需要增加费用时,我将如何从我的班级创建一个对象。这就是我为使其工作所做的工作。我不喜欢它。
我的 while 循环创建我的类的一个新实例,然后获取用户输入,设置费用类的成员变量,最后将对象添加到数组中以供以后使用。
一切正常我只是不喜欢每个对象基本上都具有相同的名称。我本来想根据用户输入的名称创建对象的名称,但我发现让用户输入类的名称并不好。所以请有任何建议。而且我对编程还很陌生,所以代码可能很乱。
NSMutableArray *myExpenses = [[NSMutableArray alloc] init];
while (enterMore == 1)
Expense *anExpense = [[Expense alloc]init];
NSLog(@"Enter an expense:\n\nName: ");
scanf("%s", expenseName);
billName = [NSString stringWithUTF8String: expenseName];
anExpense.name = billName;
NSLog(@"\nEnter the amount of the expense: ");
scanf("%lf", &expenseAmount);
anExpense.amount = expenseAmount;
NSLog(@"\nEnter the day of the month the expense is due: ");
scanf("%d", &dateDue);
anExpense.dayOfMonthDue = dateDue;
[myExpenses addObject:anExpense];
NSLog(@"Enter 1 to enter more expenses anything else to quite: ");
scanf("%d", &enterMore);
for (int i = 0; i < [myExpenses count]; i++)
NSLog(@"%@", [[myExpenses objectAtIndex:i] name]);
NSLog(@"%f", [[myExpenses objectAtIndex:i] amount]);
NSLog(@"%d", [[myExpenses objectAtIndex:i] dayOfMonthDue]);
【问题讨论】:
“每个对象基本上都具有相同的名称”是什么意思?你是说“费用”吗? “费用”是对象的类型,而不是其名称。 对象的名称?您是指在内存中保存指向您的对象的指针的变量的名称吗? 【参考方案1】:为此,您可以将实例添加到字典对象 (NSMutableDictionary) 中,您可以使用该对象通过键 (NSString) 访问每个对象。这是一种方法。以下是有关字典的更多信息的参考:
http://www.techotopia.com/index.php/Objective-C_Dictionary_Objects
更新:要回答评论,我的意思是添加实例。字典对象是一个数组,它使用键而不是数字来访问对象。问题是,你不能动态地创建实例。无法访问,因为编译器不知道这些变量是否存在并且不会编译。这就是不允许的原因。您可以做的是使用字典对象。它更容易访问,因为如果用户输入费用名称,由于输入将是一个字符串,因此会更自动地找到它。
【讨论】:
这并不能真正回答问题。将 what 添加到字典对象,以及 why?【参考方案2】:在另一个答案中有说明(所以我赞成那个),但也许举个例子会有所帮助。
NSMutableDictionary *myExpenses = [[NSMutableDictionary alloc] init];
while (enterMore == 1)
Expense *anExpense = [[Expense alloc] init];
NSLog(@"Enter an expense:\n\nName: ");
scanf("%s", expenseName);
billName = [NSString stringWithUTF8String: expenseName];
anExpense.name = billName;
NSLog(@"\nEnter the amount of the expense: ");
scanf("%lf", &expenseAmount);
anExpense.amount = expenseAmount;
NSLog(@"\nEnter the day of the month the expense is due: ");
scanf("%d", &dateDue);
anExpense.dayOfMonthDue = dateDue;
[myExpenses setObject:anExpense forKey:billName];
NSLog(@"Enter 1 to enter more expenses anything else to quite: ");
scanf("%d", &enterMore);
NSArray * allValues = [myExpenses allValues];
for (int i = 0; i < [allValues count]; i++)
Expense * myExpense = [allValues objectAtIndex:i];
NSLog(@"%@", [myExpense name]);
NSLog(@"%f", [myExpense amount]);
NSLog(@"%d", [myExpense dayOfMonthDue]);
真正的威力在于,现在您可以按名称引用一个值。例如:
Expense * anExpense = [myExpenses objectForKey:@"Expense Name"];
希望这会有所帮助。
编辑:另外,我注意到您没有在您的实例上调用 -release
或 -autorelease
。您正在使用 ARC(自动参考计数),或者如果您仍在使用 MRR(手动保留释放),您应该自动释放您的费用。如果您使用 ARC,请不要介意这一点,但如果不是 - 您将有内存泄漏。或者您可以显式调用 release(参见:Use autorelease before adding objects to a collection?)
【讨论】:
首先是的,我正在使用 ARC。其次,谢谢你,这真的帮助了我。以我的方式进行操作,我可以找出找到特定费用的方法,但这需要一些代码,但这将允许我只搜索账单的名称。按照我的方式,我必须深入研究实际对象才能找到合适的账单。谢谢以上是关于您将如何在目标 c 中动态创建类实例的主要内容,如果未能解决你的问题,请参考以下文章