2013-06-13 5 views
0

그래서 Big Nerd Ranch의 객관적인 책을 읽는 중입니다. 저는 현재 17 장에 있으며이 장의 마지막 부분에서 필요한 도전 과제를 완료 할 수있었습니다. 그러나, 나는 이해하고자하는 두 가지 질문을 가지고있다.for 루프에서 클래스의 인스턴스를 만드는 이유는 무엇입니까?

StockHolding은 인스턴스 변수가있는 사용자 지정 클래스이며 주식 (배열)은 재고 보유 및 비용을 달러로 설정하는 세 가지 재고 보유 인스턴스를 가리 킵니다.

처음에는 내가 가리키는 객체에서 데이터를 가져 오기 위해 배열에 액세스하려고 시도했지만 어레이가 객체에 포함 된 데이터를 알지 못하기 때문에 작동하지 않는 것 같습니다. 기억, 맞지?

제가 알고 싶은 것은 왜이 for 루프에서 이러한 변수에 액세스하기 위해 주식 보유 (보유)의 새로운 인스턴스를 만드는 것이 필요 했습니까? 주식 보유의 새로운 인스턴스가 내 주식의 가치를 어떻게 알 수 있습니까?

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 메서드

참고 여기서 새 인스턴스 e는 생성되지 않습니다. 배열에있는 메모리에 새로운 참조가 만들어 지므로 액세스 할 수 있습니다.

1

for 루프에는 전혀 새로운 인스턴스가 전혀 작성되지 않습니다. Objective-C 객체는 항상 포인터로 표현되기 때문에 하나의 변수 !=이 하나의 인스턴스가됩니다. 루프 내의 로컬 변수 holdings에는 각 반복시 현재 열거되고있는 배열의 요소에 대한 포인터가 할당됩니다. 이미 존재하는 객체에 대한 "참조"일뿐입니다.

0

새 인스턴스를 만들지 않습니다. 기존 인스턴스를 반복합니다.

[CODE]에서 객체를 만들고이를 NSArray에 추가했습니다. for 루프는 한 번에 하나씩 만 제공합니다. 이름이 holdings이라면, 그걸 가지고 뭔가를하고 다음을 붙잡아 라.

그게 전부입니다.

0

Objective-C 오브젝트에는 유형이 없습니다. 모든 메시지는 모든 오브젝트로 송신 될 수 있습니다. [holdings stockName]과 같은 코드는 ''holdings '객체에'stockName '메시지를 보냅니다. 따라서 Objective-C 런타임은 객체를 검사하여 메시지를 구현하는지 여부를 확인합니다. 그렇다면 실행에 실행을 전달합니다.

개체 유형에 따라 런타임시 처리 방법이 달라지지 않습니다.

NSArrayNSObject 프로토콜을 준수하는 모든 것을 저장합니다. 따라서 객체의 오래된 혼합을 유지할 수 있습니다. 다른 컬렉션에도 동일하게 적용됩니다.

단일 객체 유형을 언급하지 않고 모든 코드를 작성할 수 있지만 일반적으로 다루지 않는 객체 유형을 말하면 컴파일러에서 몇 가지 온 전성 검사를 수행 할 수 있기 때문에 일반적으로 수행하지 않습니다. 따라서 깨진 코드를 작성할 가능성이 줄어 듭니다.

그래서 코드 :

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];

참고 : 참조 만 사용되며 (할당) 개체가 할당되지 않습니다.

관련 문제