утечка памяти в простом примере кода - PullRequest
1 голос
/ 15 декабря 2011

Прежде всего, извините за количество кода. Что я делаю неправильно, управляя памятью. Я не могу понять, почему анализатор выдает утечку памяти.

@interface obj : NSObject 
{
    NSMutableArray *array;
}
@property (retain, nonatomic) NSMutableArray *array;
@end

@implementation obj
@synthesize array;

- (id)init
{
    self = [super init];
    if (self) 
    {
        // Initialization code here.
        array = [[NSMutableArray alloc] init];
    }

    return self;
}

- (void)dealloc
{
    [super dealloc];
    [array release];
}

@end

int main (int argc, const char * argv[]) 
{
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    // insert code here...
    obj *test = [[obj alloc] init];
    NSNumber *numero = [[NSNumber alloc] initWithFloat:3.4];

    NSLog(@"Número: %g \n", [numero floatValue]);

    [test.array addObject:numero];

    NSLog(@"Numero de elementos: %lu", [test.array count]);

    NSLog(@"Valor: %g", [[test.array objectAtIndex:0] floatValue]);

    NSLog(@"Numero de elementos t2: %lu", [test.array count]);

    numero = [NSNumber numberWithFloat:5.8];

    NSLog(@"Valor t2: %g", [[test.array objectAtIndex:0] floatValue]);
    NSLog(@"Número t2: %g \n", [numero floatValue]);

    [test.array addObject:numero];    

    NSLog(@"Valor: %g", [[test.array objectAtIndex:0] floatValue]);

    [numero release]; **<-- Leak of memory**
    [test release];
    [pool drain];

    return 0;
}

Ответы [ 4 ]

2 голосов
/ 15 декабря 2011

Простое исправление, вы забыли сбросить существующее значение перед его переназначением.

// You created an instance of NSNumber here
NSNumber *numero = [[NSNumber alloc] initWithFloat:3.4];

// Then you reassigned it here without releasing it first which caused the leak HERE
numero = [NSNumber numberWithFloat:5.8];

[numero release]; **<-- Leak of memory**

Вы можете обойти это полностью, используя numberWithFloat в обоих случаях, который возвращает объект с автоматическим освобождением.

NSNumber *numero = [NSNumber numberWithFloat:3.4];

numero = [NSNumber numberWithFloat:5.8];

// Now you don't need to release it at all ;)
//[numero release]; **<-- Leak of memory**

Или вы можете исправить существующий пример:

NSNumber *numero = [[NSNumber alloc] initWithFloat:3.4];

[numero release];

numero = [NSNumber numberWithFloat:5.8];

// Remove this one since numberWithFloat returns an autoreleased object
//[numero release]; **<-- Leak of memory**
2 голосов
/ 15 декабря 2011
  1. [super dealloc] ВСЕГДА ДОЛЖЕН быть последним вызовом в методе dealloc.
  2. Всякий раз, когда вы присваиваете переменную для ссылки, которой вы владеете (например, в результате вызова alloc / init), вы должны освободить ее перед переназначением.

NSNumber *numero = [[NSNumber alloc] initWithFloat:3.4];
...
[numero release]; //You must call release before reassigning
numero = [NSNumber numberWithFloat:5.8];
...
[numero release]; //This is bad because it is now assigned an autoreleased value

Теперь для вашего примера нет необходимости выделять начальный numero и просто назначать его как NSNumber *numero = [NSNumber numberWithFloat:3.4];, как вы делаете остальное, тогда нет необходимости в каких-либо вызовах для освобождения.

1 голос
/ 15 декабря 2011

В вашем методе dealloc попробуйте сначала отпустить array, а затем , а затем , вызвав [super dealloc].(Обычно вы должны сначала освободить свои ивары, прежде чем вызывать метод dealloc суперкласса.)

0 голосов
/ 15 декабря 2011

После добавления нумерации в ваш массив вы должны освободить нумерацию, потому что addObject вызывает Retain для нумерации.Второй номер 5.8 в порядке, потому что вы не вызываете на нем alloc.

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