1

我正在尝试创建一个为我生成发票的应用程序(我的第一个)。最初我的想法是有以下课程:

  • 用户(以下所有应用程序数据属于谁)
  • 客户(计费对象:姓名、公司名称、BillingAddress、电话等...)
  • 任务(发票上的一个项目:名称、描述、HourlyRate 等...)
  • 发票(由客户和多个任务组成的最终输出)

我想我可以让用户选择“添加新客户”,这将创建一个客户对象,然后将该对象存储到客户数组中。与“添加新任务”相同,它将创建一个任务对象并将其添加到任务数组中。然后,我将能够创建一个 Invoice 对象,该对象指向客户数组中的某个值和任务数组中的多个任务。

我遇到的问题是我不知道每次有人按下“添加新客户”或“添加新任务”时如何创建一个新对象。我试过做这样的事情:

Customer *customer = [[Customer alloc] init];
[customer setName:@"John Doe"];
[customer setCompanyName:@"John's Swimming Pools"];

[user1 addCustomer:customer];

[customer setName:@"Jane Smith"];
[customer setCompanyName:@"Cupcakes by Jane"];

[user1 addCustomer:customer];

for (int i = 0; i < [[user1 customers] count]; i++) {
    NSLog(@"%@",[[[user1 customers] objectAtIndex:i] name]);
}

我意识到这不起作用,因为指向客户的指针被 Jane 覆盖,所以当打印数组时,其中的两个值都说“Jane Smith”。

每次用户决定添加客户/任务时,如何创建指向对象的新指针?还是我要解决这一切都错了,应该对所有内容使用数组而不是类?我觉得这是非常基本的 OOP,我正在努力解决它。任何帮助将不胜感激,谢谢!

4

2 回答 2

1

如果每次有人按下并且只添加一个客户,那么为什么要在同一个地方添加两次?可以在客户类中定义一个简单的添加客户的工厂方法。首先在 Customer.h 中声明它,例如:

+(Customer*)createCustomerWithName:(NSString*)name AndCompany:(NSString*)cp;

然后在 .m :

+(Customer*)createCustomerWithName:(NSString*)name AndCompany:(NSString*)cp
{
   Customer *customer = [[Customer alloc] init];
   [customer setName:name];
   [customer setCompanyName:cp];
   return customer;
}

然后在您的代码中,当您需要添加客户时,只需调用:

[user1 addCustomer:[Customer createCustomerWithName:@"ALan" AndCompany:@"MS"]];

并随时调用它。你的问题应该得到解决。

注意您必须在调用此工厂方法的类中导入 Customer.h。

于 2012-06-23T14:12:17.207 回答
0

试试这个:

Customer *customer = [[Customer alloc] init];
[customer setName:@"John Doe"];
[customer setCompanyName:@"John's Swimming Pools"];

[user1 addCustomer:customer];

[customer release]; // if NOT using ARC
// or "customer = nil;" if using ARC

// now initialize a second customer object
customer = [[Customer alloc] init];
[customer setName:@"Jane Smith"];
[customer setCompanyName:@"Cupcakes by Jane"];

[user1 addCustomer:customer];

[customer release]; // if NOT using ARC; otherwise this won't compile

for (int i = 0; i < [[user1 customers] count]; i++) {
    NSLog(@"%@",[[[user1 customers] objectAtIndex:i] name]);
}

在添加第一个客户之后,我不是 100% 确定“ customer = nil;”的事情(如果且仅当使用 ARC),但重要的是您需要实例化第二个客户对象,当您将其添加到数组时,您'将有两个单独的客户对象和记录。

于 2012-06-23T14:03:50.243 回答