0

所以我正忙着阅读 Big Nerd Ranch 的 Objective-c 书籍。我目前在第 17 章,并在本章末尾完成了所需的挑战。但是,我只有两个想了解的问题。

在下面的代码中——StockHolding 是一个自定义类,它具有实例变量,stocks(一个数组)指向三个 stockholding 实例,其值设置其股票价值和以美元为单位的成本。

起初我试图访问数组以从它指向的对象中获取数据——但似乎这不起作用,因为数组不知道它的对象包含什么数据——只是它们在内存中的位置,对吧?

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

    for (StockHolding *holdings in stocks){

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

我将尝试在这里猜测一下,看看我是否能更好地理解它?

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

我可能完全离开了.. :(

有什么建议吗?

4

5 回答 5

1

stocks是一个具有类型对象的数组StockHolding

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

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

于 2013-06-13T06:29:10.780 回答
1

绝对不会在 for 循环中创建新实例。由于 Objective-C 对象总是表示为指针,一个变量!=一个实例。循环内的holdings局部变量被分配了指向当前在每次迭代时枚举的数组元素的指针。它只是对已经存在的对象的“引用”。

于 2013-06-13T06:29:39.353 回答
0

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

这个

for (StockHolding *holdings in stocks)
{

}

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

方法:

  1. 从数组中获取对象。相当于[stocks objectAtIndex:index];
  2. 将其分配给指定的对象。相当于StockHolding *holdings = [stocks objectAtIndex:index];

请注意,仅使用引用(分配)没有分配对象。

于 2013-06-13T06:39:05.060 回答
0

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

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

就这样。

于 2013-06-13T06:30:28.430 回答
0

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

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

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

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

所以代码:

for (StockHolding *holdings in stocks)

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

因此,例如:

NSMutableArray *arrayOfStrings = [NSMutableArray array];

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

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

将完美地编译和工作——不是因为字符串实际上被转换为数字,而是因为两个类都实现floatValue了返回一个float. 所以 eachNSNumber *number实际上是一个NSString,如果你试图调用isEqualToNumber:它们中的任何一个,你会引发一个异常,因为这不是由字符串实现的。但是告诉编译器你将把它们当作数字来表现意味着你不会收到使用警告,floatValue并且当运行时发现对象实现floatValue执行时会像往常一样继续执行。

于 2013-06-13T06:34:54.880 回答