2013-06-13 7 views
0

Итак, я занят чтением книги с объективной книгой от Big Nerd Ranch. Я нахожусь в главе 17 на данный момент и сумел завершить требуемый вызов в конце главы. Однако у меня есть только два вопроса, которые я хотел бы понять.Почему мы создаем экземпляры классов для циклов?

В следующем фрагменте кода - StockHolding - это пользовательский класс с переменными экземпляра и запасами (массив), указывающий на три экземпляра пакета акций со значениями, устанавливающими его стоимость акций и стоимость в долларах.

Сначала я попытался получить доступ к массиву, чтобы получить данные от объектов, на которые он указал, но, похоже, что это не сработает, поскольку массив не знает, какие данные содержат его объекты - именно там, где они находятся памяти, правильно?

Что я хочу знать, почему было необходимо создать новый экземпляр акций (холдингов) в этом цикле для доступа к этим переменным? Как новый экземпляр акционерного капитала знает, каковы ценности моих акций?

for (StockHolding *holdings in stocks){ 

     NSLog (@ "%@ has %d shares. Cost: $%.2f. Stock value: $%.2f", [holdings stockName],[holdings numberOfShares], [holdings costInDollars], [holdings valueInDollars]); 
    } 

Я собираюсь попытаться угадать здесь, чтобы узнать, может быть, я понимаю это немного лучше?

Мы создаем экземпляр нашего класса в цикле for так, чтобы у нас был доступ к его методам и переменным экземпляра - тогда мы используем массив запасов, чтобы получить переменные от этих объектов в массиве?

я могу быть полностью выключен .. :(

Любые советы?

+0

сейчас новый экземпляр создается здесь в вашем цикле for – amar

+3

Вы неправильно поняли. В цикле не создаются новые экземпляры. Вы просто создаете переменную, которая указывает на каждый существующий объект в массиве. – rmaddy

ответ

1

stocks представляет собой массив, имеющий объекты типа StockHolding

Так что для того, чтобы получить доступ ко всем значений в массиве и печати значения. Вам нужно получить весь экземпляр StockHolding внутри используемого массива for ...in метод

примечание Здесь новый instanc e не создается только новая ссылка на память, которая находится в массиве, так что вы можете получить к ней доступ и использовать ее

1

Абсолютно никаких новых экземпляров в цикле for вообще не создаются. Поскольку объекты Objective-C всегда представлены как указатели, одна переменная != один экземпляр. Локальной переменной holdings внутри цикла присваивается указатель на элемент массива, который в настоящее время перечисляется на каждой итерации. Это просто «ссылка» на уже существующий объект.

0

Вы не создаете новые экземпляры. Вы повторяете существующие экземпляры.

Предположительно в [CODE] вы создали объекты и добавили их в NSArray. Цикл for просто дает их вам по одному. Вы назовете его holdings, сделайте что-нибудь с ним, затем возьмите следующий.

Это все.

0

Объекты Objective-C являются пустыми. Любое сообщение может быть отправлено на любой объект. Код, например, [holdings stockName] означает «отправить сообщение« StockName »в« holdings »объекта. Таким образом, среда выполнения Objective-C проверит объект, чтобы узнать, реализует ли оно это сообщение. Если это так, то это приведет к исполнению в реализацию.

Тип вашего объекта не имеет никакого отношения к тому, как обработка будет выполняться во время выполнения.

NSArray хранит все, что соответствует протоколу NSObject. Таким образом, он может содержать любое старое сочетание объектов. То же самое касается других коллекций.

Хотя вы могли бы написать весь свой код без упоминания одного типа объекта, вы обычно этого не делаете, потому что, если вы говорите, с каким типом объектов вы имеете дело, тогда компилятор может выполнить некоторые проверки здравомыслия. Это делает вас менее склонным к написанию неработающего кода.

Поэтому код:

for (StockHolding *holdings in stocks) 

просто означает «позвольте мне сделать что-то для каждого объекта в коллекции stocks и не дают мне никаких предупреждений компилятора, когда я отношусь к ним как экземпляры StockHolding». На самом деле они могут быть другими классами. Если это другие классы, которые реализуют 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, выполнение продолжается, как обычно.

0

Цикл for..in используется для быстрого перечисления.

Это

for (StockHolding *holdings in stocks) 
{ 

} 

не создаст новый объект, он принимает один объект из массива и приведение его в указанный тип и назначить его в указанной переменной.

Средства:

  1. принимает объект из массива. Эквивалент [stocks objectAtIndex:index];
  2. Назначьте его указанному объекту. Эквивалент StockHolding *holdings = [stocks objectAtIndex:index];

Отметьте, что Используется только для ссылки.