Objective-C中具有相同名称的多个对象

时间:2014-12-01 12:28:57

标签: objective-c

我一直在学习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;。它在循环内部完成。但是,它是如何工作的,为什么编译器允许这样做呢?感谢

1 个答案:

答案 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继续累积您创建的实例。

为什么你认为编译器不应该允许这个?