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