2010-01-07 5 views
0

Kochan Obj-C 2.0의 예제를 이해하려고합니다. 이 모양입니다. 기본적으로 우리는 표준 추가 분율 방법이 있습니다참조 계산 예

-(Fraction *)add:(Fraction *) f { 
Fraction *result = [[Fraction alloc] init]; 
int resultNum, resultDenom; 
resultNum = nermator *f.denominator + denominator*f.numerator; 
resultDenom = denominator *f.denominator 
// numerator and denominator are instance variables 
[result setTo: restultNum over: resultDenom]; // another method that sets the fraction (e.g. 1/4) 
[result reduce]; 
return result} 

가 main.m 테스트 파일에 이해가되지 않는이, 하나를 사용하여 두 개의 예제가 있습니다을 그들이 수행

Fraction *aFraction = [[Fraction alloc] init]; 
Fraction *bFraction = [[Fraction alloc] init]; 
Fraction *resultFraction; 

[aFraction setTo: 1 over: 4]; 
[bFraction setTo: 1 over: 2]; 

resultFraction = [aFraction add: bFraction]; 

내가 돈 ' add 메소드를 사용하기 전에 resultFraction을 할당하고 초기화 할 필요가없는 이유를 이해해야합니다. (Question # 1) 또한, 이렇게함으로써 resultFraction의 참조 카운트가 1이됩니까? 또는 결코 alloc'd와 init'd가 아니기 때문에 참조 카운트가 여전히 0입니까? 요컨대,이 예에서는

Fraction *aFraction = [[Fraction alloc] init]; 
Fraction *sum = [[Fraction alloc] init], *sum2; 
int i, n, pow2; 

[sum setTo: 0 over:1]; // set 1st fraction to 0 

NSLog(@"Enter n:"); 
scanf("%i", &n); 

pow2 = 2; 
for (i = 1; i <=n; ++i) { 
[aFraction setTo: 1 over: pow2]; 
sum2 = [sum add: aFraction]; 
[sum release]; 
sum = sum2; 
pow2 *=2; 
} 

이다 동일한 분수 클래스 및 방법을 사용

그들은/2 N 여기서

코드가^(1)의 합을 계산하는 방법의 예를 도시 alloc'd 및 init'd를 호출하여 aFraction에 추가하고 결과를 sum2에 할당하면 sum이 해제됩니다. 그러면 다음 줄에 어떨까요 (sum = sum2). sum은 그 값을 여전히 보유하고 있습니까? 원인은 이제 한 번만 초기화되었으므로 릴리스 이후 참조 카운트가 0이되지 않습니다. 나는 sum2가 증가 된 레퍼런스 카운트를 가질 것이고 그것이 sum에 할당되면 relased 될 필요가있을 것이라고 생각했다.

멍청한 놈. 죄송합니다.

답변

4

질문 # 1

당신이 ALLOC 필요하고 추가 방법은 당신을 위해 것을 않기 때문에 결과 부분은 init을하지 않는 이유. (2 행) 그것은 결코 공개되지 않았기 때문에 참조 횟수가 하나가되었습니다. ([resultFraction 해제])이 예에서

질문 # 2

는, 그 합계가 방출 된 후 그 지점에서 0의 참조 카운트를 가져야 실제로 정확하다. 괜찮을거야. 그러나 sum2는 여전히 유효하며 sum에 할당하고 있습니다.

이것은 간단한 포인터 할당입니다. sum은 포인터이며 단순히 메모리 덩어리를 봅니다. 그 덩어리의 메모리가 공개되면 결국 수집 될 것입니다. sum = sum2의 대입은 sum2가 나타내는 객체의 위치를 ​​복사합니다. 일반적으로 목표 - C 초보자 간과 무엇 http://www.informit.com/articles/article.aspx?p=1272497&seqNum=2

+2

덧붙여서,'add :'*에서 얻은 분수는'add :'메소드에서 자동으로 해제되어야합니다. 이 경우는 아니지만 분명히 실수입니다. – Chuck

+0

질문 # 2에 관해서는 [sum2 release]가 호출되지 않는 이유입니까? 첫 번째 예제에서는 resultFraction을 마지막에 해제해야하지만 sum [sum release]을 사용하여 메모리에서 동일한 지점을 가리키는 sum2를 할당하면 [sum2 release]와 본질적으로 같습니다. ? sum2 = [합계 : a 분수]; // sum2는 보유 수 1, sum은 보유 수 1 [sum release]; // 합계는 0입니다. sum = sum2; // sum, sum2 보유 개수가 1 맞습니까? 다시 한 번 감사드립니다! – jet

+0

맞습니다. [sum2 release]를 할 경우 동일한 메모리를 참조 할 때 sum과 sum2가 무효화됩니다. 당신이 말할 때 : sum = sum2 sum과 sum2는 실제로 똑같은 정확한 위치를 가리키며, 따라서 똑같은 정확한 데이터를 포함합니다. 참조를 취소하고 합계를 변경하려는 경우 sum2에 반영됩니다. –

1

aFractionbFraction 같은 변수 이름 객체에 불과 , 그들은 실제 개체를 나타내지 않는다는 것입니다 : 포인터에 대한 자세한 내용은

메모리에. aFractionbFraction은 완전히 다른 개체를 설정하여 동일한 개체를 가리킬 수 있습니다.

처음에는 resultFraction 변수가 선언되었지만 아직 설정되지 않았습니다. aFraction 개체에서 add: 메서드를 호출하면이 메서드는 새로 할당 된 개체 (추가 결과 포함)를 반환하고 resultFraction 변수는 이제 해당 새 개체를 가리 킵니다.