2014-12-01 2 views
1

Я изучаю Objective-C из книги Big Nerd Ranch. Я застрял в коде примера 21-й главы.Несколько объектов с тем же именем в Objective-C

Вот класс заголовка 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 класса с таким же именем т.е. 'Мики'. Это делается внутри цикла. Но как это работает, почему компилятор разрешает это? Спасибо

+1

Объекты не имеют имен (если они не содержат, например, свойство 'name'). У указателей есть имена. Совершенно разные вещи (и фундаментальный момент, который вы должны понимать, прежде чем пытаться закодировать в Objectiver-C). –

+0

У объектов и указателей одинаково нет имен. Переменные имеют имена. – tenfour

+0

@tenfour - Точка взята! –

ответ

5

Это очень простой синтаксический вопрос об объективе-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 продолжает накапливать созданные вами экземпляры.

Почему, по вашему мнению, компилятор не должен этого допускать?

+1

В одной строке «Вы ** над * записью ***' mikey' каждая итерация ». –

+0

Eloquence никогда не была моей силой :) – tenfour

Смежные вопросы