Пример подсчета ссылок - PullRequest
       10

Пример подсчета ссылок

0 голосов
/ 07 января 2010

Я пытаюсь понять пример из книги 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];

Я не понимаю, почему вам не нужно выделять и инициализировать resultFraction перед использованием метода add. (Вопрос № 1) Кроме того, благодаря этому, resultFraction теперь имеет счетчик ссылок 1? Или из-за того, что он никогда не выделялся и не инициализировался, счетчик ссылок по-прежнему равен 0?

Используя тот же класс дроби и методы, они показывают пример того, как вычислить суммирование 1/2 ^ n

Вот код:

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

В этом примере sum - это alloc'd и init'd, и он добавляется к aFraction, и результат присваивается sum2, затем сумма освобождается. Так как же в следующей строке (sum = sum2) сумма по-прежнему сохраняет это значение? Причина не суммируется, теперь имеет счетчик ссылок 0 после освобождения, поскольку он был инициализирован только один раз. Я думал, что sum2 будет иметь увеличенный счетчик ссылок, и его нужно будет пересчитать после того, как он будет назначен сумме.

Извините за нубские вопросы.

Ответы [ 2 ]

4 голосов
/ 07 января 2010

Вопрос № 1

Причина, по которой вам не нужно выделять и инициализировать дробную часть результата, заключается в том, что метод add делает это за вас. (Строка 2) Счетчик ссылок теперь один, потому что он никогда не был выпущен. ([resultFraction release];)

Вопрос № 2

В этом примере вы действительно правы, что сумма должна иметь счетчик ссылок 0 в этот момент после освобождения. Это должно быть хорошо. Однако sum2 все еще действует, и вы присваиваете его сумме.

Это простое присвоение указателя. sum - указатель, и он просто смотрит на кусок памяти. Когда этот кусок памяти будет освобожден, он в конечном итоге будет собран. Назначение sum = sum2 просто копирует местоположение объекта sum2, представляющего сумму.

Для получения дополнительной информации об указателях: http://www.informit.com/articles/article.aspx?p=1272497&seqNum=2

1 голос
/ 07 января 2010

Что обычно упускают новички в Objective-C, так это то, что ваши имена переменных, такие как aFraction и bFraction просто указывают на объект, они не представляют фактический объект в памяти. Для aFraction и bFraction вполне возможно указывать на один и тот же объект, просто устанавливая один объект на другой.

В начале переменная resultFraction объявляется, но еще не настроена, чтобы указывать на что-либо. Когда вы вызываете метод add: для вашего aFraction объекта, метод возвращает вновь выделенный объект (который содержит результат вашего добавления), и переменная resultFraction теперь указывает на этот новый объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...