为什么我们在for循环中创建类的实例?

时间:2013-06-13 06:23:40

标签: objective-c

所以我正忙着读Big Nerd Ranch的一本客观的书。我现在正在第17章,并在本章结束时设法完成了所需的挑战。但是,我只想提出两个我想了解的问题。

在下面的代码中 - StockHolding是一个具有实例变量的自定义类,而股票(数组)指向三个库存实例,其值设置其股票价值和成本(以美元计)。

起初我尝试访问数组以从它指向的对象获取数据 - 但似乎不会起作用,因为数组不知道它的对象包含哪些数据 - 它们在内存中的位置, 对?

我想知道为什么有必要在这个for循环中创建一个新的库存(馆藏)实例来访问这些变量? 新的库存实例如何知道我的股票价值是多少?

    for (StockHolding *holdings in stocks){

        NSLog (@ "%@ has %d shares. Cost: $%.2f. Stock value: $%.2f", [holdings stockName],[holdings numberOfShares], [holdings costInDollars], [holdings valueInDollars]);
    }

我打算在这里猜一下,看看我是否理解它好一点?

我们在for循环中创建了一个类的实例,以便我们可以访问它的实例方法和变量 - 然后我们使用stocks数组从数组中的那些对象中获取变量?

我可能完全离开.. :(

有什么建议吗?

5 个答案:

答案 0 :(得分:1)

stocks是一个具有StockHolding

类型对象的数组

因此,为了访问数组中的所有值并打印值。您需要获取我们使用的数组中的所有StockHolding实例for ...in方法

note 这里没有创建新实例,只是对数组中的内存进行了新的引用,以便您可以访问它并使用它

答案 1 :(得分:1)

绝对没有在for循环中创建新实例。由于Objective-C对象总是表示为指针,因此一个变量!=一个实例。循环内的holdings局部变量被赋予指向当前在每次迭代时枚举的数组元素的指针。它只是现有对象的“参考”。

答案 2 :(得分:0)

您没有创建新实例。你正在迭代现有的实例。

大概在[CODE]中你创建了对象并将它们添加到NSArray。 for循环只是一次给你一个。你把它命名为holdings,用它做点什么,然后抓住下一个。

就是这样。

答案 3 :(得分:0)

在Objective-C中,对象是无类型的。任何消息都可以发送到任何对象。像[holdings stockName]这样的代码意味着“将消息'stockName'发送到对象'馆藏'”。因此,Objective-C运行时将检查对象以查看它是否实现了该消息。如果是,那么它将把执行传递给实现。

对象的类型对运行时处理方式没有影响。

NSArray存储符合NSObject协议的任何内容。所以它可以容纳任何旧的混合对象。其他系列也是如此。

虽然您可以在不提及单个对象类型的情况下编写所有代码,但通常不会这样做,因为如果您说出正在处理的对象类型,则编译器可以执行一些健全性检查。这使您不太可能编写损坏的代码。

所以代码:

for (StockHolding *holdings in stocks)

只是意味着“让我对集合stocks中的每个对象执行某些操作,并且当我将它们视为StockHolding的实例时,不要给我任何编译器警告”。他们实际上可能是其他类。如果他们是其他实现stockNamenumberOfShares的其他类,那么您的代码将完美运行。

所以,例如:

NSMutableArray *arrayOfStrings = [NSMutableArray array];

[arrayOfStrings addObject:@"34.3"];
[arrayOfStrings addObject:@"19.8"];

float total;
for(NSNumber *number in arrayOfStrings)
{
    total += [number floatValue];
}

将完美地编译和工作 - 不是因为字符串实际上已转换为数字,而是因为两个类都实现floatValue以返回float。因此,每个NSNumber *number实际上都是NSString,如果您尝试在其中任何一个上调用isEqualToNumber:,则会引发异常,因为这不是由字符串实现的。但是告诉编译器你将采取行动,好像他们是数字意味着你没有得到使用floatValue的警告,并且当运行时发现对象实现floatValue执行时,照常继续执行。

答案 4 :(得分:0)

for..in循环用于快速枚举。

for (StockHolding *holdings in stocks)
{

}

不会创建任何新对象,它从数组中获取一个对象并将其转换为指定的类型并将其分配给指定的变量。

表示:

  1. 从数组中获取对象。相当于[stocks objectAtIndex:index];
  2. 将其分配给指定的对象。相当于StockHolding *holdings = [stocks objectAtIndex:index];
  3. 请注意仅使用引用(赋值),没有分配对象。