您将如何在目标c中动态创建类实例

时间:2012-06-25 00:13:11

标签: iphone objective-c

我不确定我是否使用错误的词汇来搜索这个,但我找不到任何与我想要做的事情有关的事情。

我有一个课程,我已经为进入费用。我有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]);
}

2 个答案:

答案 0 :(得分:1)

您可以为此做的是将实例添加到字典对象(NSMutableDictionary),您可以使用键(NSString)访问每个对象。这是一种方法。以下是有关diccionaries的更多信息:

http://www.techotopia.com/index.php/Objective-C_Dictionary_Objects

更新:要回答评论,我的意思是添加实例。字典对象是一个数组,它使用键来访问对象而不是数字。问题是,你无法在动态创建实例。访问是不可能的,因为编译器不会知道这些变量是否存在且不会编译。这就是不允许的原因。你可以做的是使用字典对象。它更容易访问,因为如果用户输入费用名称,由于输入将是一个字符串,因此可以更自动地找到它。

答案 1 :(得分:0)

在另一个答案中说明了(所以我赞成了那个),但也许一个例子会有所帮助。

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?