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 될 필요가있을 것이라고 생각했다.멍청한 놈. 죄송합니다.
덧붙여서,'add :'*에서 얻은 분수는'add :'메소드에서 자동으로 해제되어야합니다. 이 경우는 아니지만 분명히 실수입니다. – Chuck
질문 # 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
맞습니다. [sum2 release]를 할 경우 동일한 메모리를 참조 할 때 sum과 sum2가 무효화됩니다. 당신이 말할 때 : sum = sum2 sum과 sum2는 실제로 똑같은 정확한 위치를 가리키며, 따라서 똑같은 정확한 데이터를 포함합니다. 참조를 취소하고 합계를 변경하려는 경우 sum2에 반영됩니다. –