我一直在学习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类创建多个对象,即'mikey'.它在循环内部完成.但是,它是如何工作的,为什么编译器允许这样做呢?谢谢
这是关于objective-C的一个非常基本的语法问题.
mikey
是一个指向a实例的变量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
继续累积您创建的实例.
为什么你认为编译器不应该允许这个?