Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 为什么我们要在for循环中创建类的实例?_Objective C - Fatal编程技术网

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

Objective c 为什么我们要在for循环中创建类的实例?,objective-c,Objective C,所以我正忙着读Big Nerd Ranch写的objective-c书。目前我正在学习第17章,并在本章末尾完成了所需的挑战。不过,我只想了解两个问题 在下面的代码位中-StockHolding是一个自定义类,它具有实例变量,stocks(一个数组)指向StockHolding的三个实例,其值以美元为单位设置其股票价值和成本 起初,我试图访问数组以从它指向的对象中获取数据,但似乎不起作用,因为数组不知道它的对象包含哪些数据,只是它们在内存中的位置,对吗 我想知道的是,为什么需要在这个for循环中

所以我正忙着读Big Nerd Ranch写的objective-c书。目前我正在学习第17章,并在本章末尾完成了所需的挑战。不过,我只想了解两个问题

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

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

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

    for (StockHolding *holdings in stocks){

        NSLog (@ "%@ has %d shares. Cost: $%.2f. Stock value: $%.2f", [holdings stockName],[holdings numberOfShares], [holdings costInDollars], [holdings valueInDollars]);
    }
我试着猜猜看我是否能理解得更清楚一点

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

我可能完全疯了(


有什么建议吗?

stocks
是一个数组,其对象类型为
StockHolding

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


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

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

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

大概在[CODE]中,您已经创建了对象并将它们添加到NSArray。for循环一次只给您一个对象。您可以将其命名为holdings,对其进行处理,然后获取下一个对象


仅此而已。

在Objective-C中,对象是无类型的。任何消息都可以发送到任何对象。类似于[holdings stockName]的代码表示“将消息'stockName'发送到对象'holdings'”。因此,Objective-C运行时将检查对象是否实现该消息。如果是,则将执行传递到实现中

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

NSArray
存储符合
NSObject
协议的任何内容。因此,它可以保存任何对象的旧组合。其他集合也是如此

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

因此,代码:

for (StockHolding *holdings in stocks)
意思是“让我对集合中的每个对象
库存
做点什么,当我把它们当作
库存
的实例时,不要给我任何编译器警告。”。它们实际上可能是其他类。如果它们是实现
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
。因此每个
NSNumber*number
实际上都是一个
NSString
,如果您试图调用其中任何一个,比如说,
isEqualToNumber:
,您会发现这是一个异常,因为它不是由字符串实现的。但是告诉编译器你将把它们当作数字来执行,意味着你不会因为使用
floatValue
而收到警告,并且当运行时发现对象实现
floatValue
时,执行会像往常一样继续。

for..in循环用于快速enu梅拉廷。

这个

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

表示:

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

  • 请注意,只使用了引用(赋值),没有分配对象。

    现在正在循环中创建新实例,因为您误解了。循环中没有创建新实例。您只需创建一个指向数组中每个现有对象的变量。
    for (StockHolding *holdings in stocks)
    {
    
    }