您将如何在目标 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 中动态创建类实例的主要内容,如果未能解决你的问题,请参考以下文章

Python动态继承:如何在创建实例时选择基类?

Python中动态创建类实例

如何根据数据库的字段动态创建实体类? 用java啊~ 最好给点源码和实例

在DELPHI中窗体之间 如何传递数据?

如何在 python 中腌制一个动态创建的嵌套类?

如何获取动态创建的电影剪辑或名称的实例名称?