从iOS中的对象数组中获取值

时间:2014-12-18 14:15:45

标签: ios objective-c for-loop nsmutablearray

我刚接触iphone。我正在开发一个应用程序,我们需要从一个对象数组中计算它。

我创建了一个NSObject类"目录",其中包括catalogue_Value和catalogue_quantity。现在,假设我的数组中有两个目录对象,那么我需要计算总值。

这是我的代码:

int initialTotalPoints = 9999;
int totalUsedPoints = 0;

for (int i = 0; i<[arrayCheckout count];i++)
{
    Catalogue *catalog = [[Catalogue alloc] init];
    catalog = [arrayCheckout objectAtIndex:i];

    NSLog(@"checkout voucher %d is = %d*%d", i, catalog.catalogue_Value,catalog.catalogue_quantity);
    totalUsedPoints = catalog.catalogue_Value * catalog.catalogue_quantity;
}

initialTotalPoints = initialTotalPoints-totalUsedPoints; 

问题是由于for循环,总是需要&#34; totalUsedPoints&#34;我的最后一个数组对象。但实际上,我需要添加&#34; catalog.catalogue_Value,catalog.catalogue_quantity&#34;在我的&#34; totalUsedPoints&#34;根据我的总数组对象。请帮我解决这个问题。谢谢!

3 个答案:

答案 0 :(得分:1)

如果您只想总结每个目录的数量*值

int totalPoints = 0;
for (int i = 0; i<[arrayCheckout count];i++) {
    Catalogue *catalog = [arrayCheckout objectAtIndex:i];
    totalPoints += catalog.catalogue_Value * catalog.catalogue_quantity;
}
// totalPoints is now the sum of each arrays catalogue_Value*catalogue_quantity

你可以查看Blockskit,这是一个很好的包,可以让数组迭代更容易

答案 1 :(得分:0)

这里没有具体的目标c。您使用新值覆盖totalUsedPoints的每个循环。然后你不用它,它会被覆盖。在循环结束时,它只包含分配给它的最后一个值。

我认为你在寻找的是:

totalUsedPoints += catalog.catalogue_Value * catalog.catalogue_quantity;

+=等于:

totalUsedPoints = totalUsedPoints + catalog.catalogue_Value * catalog.catalogue_quantity;

表示将为其分配前一个值,再加上新值

答案 2 :(得分:0)

这是计算机科学101的东西,不是Objective-C独有的。其他人已经发布了有关您做错了什么以及如何解决问题的信息。我想指出代码中的另一个缺陷。看看这两行:

Catalogue *catalog = [[Catalogue alloc] init];
catalog = [arrayCheckout objectAtIndex:i];

在第一行中,您将创建一个新的空目录对象,并在变量catalog中保存指向它的指针。在下一行中,您将从arrayCheckout对象中获取一个对象,并在目录变量中保存指向它的指针。您最终会丢弃之前创建的对象。

这就像制造一辆全新的汽车,把它放在你的房子前面,然后将它从一个停车场的编号停车位中取出并取出现有的汽车。

在ARC中,您在第一个对象中创建的空目录对象将在下一行中被释放,因此您不会泄漏内存,但创建一个立即丢弃的对象毫无意义且浪费。 (内存分配是像iOS这样的操作系统中最慢的任务之一。它必须进行内核调用)

如果您的程序使用手动引用计数,那么您将泄漏Catalog对象。它永远不会被取消分配。这两行应该是这样的:

Catalogue *catalog;
catalog = [arrayCheckout objectAtIndex:i];

甚至是1行:

Catalogue *catalog = [arrayCheckout objectAtIndex:i];