我一直在学习Big Nerd Ranch Book的Objective-C。我被困在第21章示例代码中。
这是BNREmployee类标题和主文件代码。
标题
@interface BNREmployee : BNRPerson
{
NSMutableArray *_assets;
}
@property (nonatomic) unsigned int employeeID;
@property (nonatomic) unsigned int officeAlarmCode;
@property (nonatomic) NSDate *hireDate;
@property (nonatomic, copy) NSArray *assets;
- (double)yearsOfEmployment;
- (void)addAsset:(BNRAsset *)a;
- (unsigned int)valueOfAssets;
@end
的main.m
for (int i = 0; i < 10; i++) {
// Create an instance of BNREmployee
BNREmployee *mikey = [[BNREmployee alloc] init];
// Give the instance variables interesting values
mikey.weightInKilos = 90 + i;
mikey.heightInMeters = 1.8 - i/10.0;
mikey.employeeID = i;
// Put the employee in the employees array
[employees addObject:mikey];
}
所以,我的问题是我们如何为具有相同名称的BNREmployee类创建多个对象,即&#39; mikey&#39;。它在循环内部完成。但是,它是如何工作的,为什么编译器允许这样做呢?感谢
答案 0 :(得分:5)
这是关于objective-C的一个非常基本的语法问题。
mikey
是一个指向BNREmployee
实例的变量。每次循环迭代,您创建一个新的BNREmployee
实例,并覆盖mikey
以指向新实例。
这一行:
BNREmployee *mikey = [[BNREmployee alloc] init];
创建BNREmployee
的实例,并将其分配给mikey
。
您可以创建BNREmployee
的另一个实例并再次执行相同操作:
mikey = [[BNREmployee alloc] init];// same thing again.
在循环中执行此操作与执行此操作基本相同。一个更简单的例子是:
int mikey = 1;
mikey = 2;
mikey = 3;
这是相同的概念;您正在创建整数并将它们分配给mikey
。
在您的代码中,实例通过行employees
存储在[employees addObject:mikey];
中。
现在,您创建的BNREmployee
实例存储在多个位置:一次在mikey
,一次
employees
中的某个地方。循环继续时,mikey
将被重新分配给另一个新实例。
employees
继续累积您创建的实例。
为什么你认为编译器不应该允许这个?