应用程序组织:类与数组

时间:2012-06-23 13:58:05

标签: objective-c ios oop

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

  • 用户(所有以下应用程序数据都属于)
  • 客户(收费人:姓名,公司名称,BillingAddress, 电话等...)
  • 任务(发票上的专列项:名称,描述, HourlyRate等...)
  • 发票(由客户和客户组成的最终输出) 多个任务)

我想我可以让用户选择“添加新客户”,这将创建一个Customer对象,然后将该对象存储到客户数组中。 “添加新任务”也是如此,它将创建一个Task对象并将其添加到任务数组中。然后,我就可以创建一个Invoice对象,该对象指向customer数组中的某个值和tasks数组中的多个任务。

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

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,我正在努力绕过它。非常感谢任何帮助,谢谢!

2 个答案:

答案 0 :(得分: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"]];

随时打电话给你。你的问题应该解决了。

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

答案 1 :(得分: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时),但重要的是您需要实例化第二个Customer对象以及何时将它添加到数组中,您将拥有两个单独的客户对象和记录。