Метод утечки в объективе C - PullRequest
3 голосов
/ 26 мая 2011

Я работаю через Программирование Стивена Кочана в Objective-C (который должен признать, что я - полный новичок).

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

Вот определение метода вычитания (остальные имеют очень похожую форму):

-(Fraction *)   subtract: (Fraction *) f;
{
    Fraction    *result = [[Fraction alloc] init];
    int         resultNum, resultDenom;

    resultNum = numerator * f.denominator - f.numerator * denominator;
    resultDenom = denominator * f.denominator;

    [result setTo: resultNum over: resultDenom];

    return result;
    [result release];
}

Мысли, чтобы закрыть утечки?Заранее спасибо.

Кроме того, я искал другие объяснения на сайте, но, к сожалению, я не думаю, что кто-то еще спросил что-то столь простое.

Ответы [ 2 ]

8 голосов
/ 26 мая 2011

Проблема в том, что в:

return result;
[result release];

-release никогда не отправляется на result, потому что ни один оператор после return не выполняется.Такие операторы называются мертвым кодом.

Вы должны автоматически выпустить свой объект, например:

return [result autorelease];

Обратите внимание, что вы должны использовать -autorelease вместо -release, потому что -release вызоветнемедленное освобождение result, что не то, что вы хотите.С другой стороны, автоматически освобожденный объект освобождается в какой-то момент в будущем, в частности, когда сливается соответствующий пул автоматического освобождения.

4 голосов
/ 26 мая 2011

Заменить:

return result;
[result release];

С:

return [result autorelease];
...