Вопрос о выделении и освобождении объекта в функции - PullRequest
0 голосов
/ 19 июля 2011

Это код, он не работает, когда [релиз unosUpisa]; и [unosRazlike release]; введены;

Как правильно выпустить эти unosUpisa и unosRazlike объекты?

-(IBAction) padIliStilja: (id) sender
{
    NSNumber *unosUpisa = [[NSNumber alloc] init];
    NSNumber *unosRazlike = [[NSNumber alloc] init];
    if ([sender tag] == 1)
    {
    unosUpisa = [NSNumber numberWithInt: 162 + [Data variables].zvanja];
    unosRazlike = [NSNumber numberWithInt: 0];
    }
    else if ([sender tag] == 2)
    {
        unosRazlike = [NSNumber numberWithInt: 252 + [Data variables].zvanja];
        unosUpisa = [NSNumber numberWithInt: 0];
    }

    if ([Data variables].upisZaMi == NO)
    {
        [[Data variables].rezultatMi addObject: unosUpisa];
        [[Data variables].rezultatVi addObject: unosRazlike];
    }
    else
    {
        [[Data variables].rezultatVi addObject: unosUpisa];
        [[Data variables].rezultatMi addObject: unosRazlike];
    }

    [self dismissModalViewControllerAnimated: NO];
    [unosUpisa release];
    [unosRazlike release];
}

Ответы [ 4 ]

0 голосов
/ 19 июля 2011

Откройте ваш проект в Xcode 4, перейдите в меню Product и выберите Анализ . Xcode добавит к вашим файлам синие пометки с полной документацией на любые ошибки управления памятью, которые могут возникнуть при использовании этого метода.

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

0 голосов
/ 19 июля 2011

Сначала вы динамически распределяете NSNumber, затем в вашем состоянии

if ([sender tag] == 1)
{
unosUpisa = [NSNumber numberWithInt: 162 + [Data variables].zvanja];
unosRazlike = [NSNumber numberWithInt: 0];
}
else if ([sender tag] == 2)
{
    unosRazlike = [NSNumber numberWithInt: 252 + [Data variables].zvanja];
    unosUpisa = [NSNumber numberWithInt: 0];
}

Вы выделяете NSNumber в стеке, теряя тем самым соединение с динамически назначаемым NSNumber

Лучше было бы

if ([sender tag] == 1)
{
unosUpisa = [[NSNumber alloc] initWithInt: 162 + [Data variables].zvanja];
unosRazlike = [[NSNumber alloc] initWithInt: 0];
}
else if ([sender tag] == 2)
{
    unosRazlike = [[NSNumber alloc] initWithInt: 252 + [Data variables].zvanja];
    unosUpisa = [[NSNumber alloc] initWithInt: 0];
}
0 голосов
/ 19 июля 2011

Вы должны release каждый объект, которым вы владеете (вы сохранили, скопировали или инициализировали / выделили). Способ, которым вы отпускаете свои объекты в конце, верен, , но , здесь unosRazlike = [NSNumber numberWithInt: 0];, вы присвоили unosRazlike другое значение, не освобождая предыдущее, и здесь есть утечка.
Кроме того, с помощью такого метода вы должны сохранить свой объект.

Итак:

unosRazlike = ...
// first
[unosRazlike release];
unosRazlike = [[NSNumber numberWithInt: 0] retain];
// ...
[unosRazlike release];

EDIT

-(IBAction) padIliStilja: (id) sender
{
    // this is no matter
    NSNumber *unosUpisa = [[NSNumber alloc] init];
    NSNumber *unosRazlike = [[NSNumber alloc] init];
    if ([sender tag] == 1)
    {
        // don't forget to release them !
        [unosUpisa release]; [unosRazlike release];
        // and to retain (numberWithInt returns autoreleased object
        unosUpisa = [[NSNumber numberWithInt: 162 + [Data variables].zvanja] retain];
        unosRazlike = [[NSNumber numberWithInt: 0] retain];
    }
    else if ([sender tag] == 2)
    {
        // same again
        [unosUpisa release]; [unosRazlike release];
        // and to retain (numberWithInt returns autoreleased object
        unosRazlike = [[NSNumber numberWithInt: 252 + [Data variables].zvanja] retain];
        unosUpisa = [[NSNumber numberWithInt: 0] retain];
    }

    if ([Data variables].upisZaMi == NO)
    {
        [[Data variables].rezultatMi addObject: unosUpisa];
        [[Data variables].rezultatVi addObject: unosRazlike];
    }
    else
    {
        [[Data variables].rezultatVi addObject: unosUpisa];
        [[Data variables].rezultatMi addObject: unosRazlike];
    }

    [self dismissModalViewControllerAnimated: NO];
    [unosUpisa release];
    [unosRazlike release];
}

Но только мысль ... зачем инициализировать "пустые" числовые объекты, если вы устанавливаете значение в части if или else?

Просто объявите их

NSNumber *unosRazlike, *unosUpisa;

и установите их значения в if / else.

0 голосов
/ 19 июля 2011

Попробуйте переместить вызовы, прежде чем закрыть диспетчер ViewController.Нет смысла освобождать эту память, когда ваш ViewController уже выпускается.

...