Утечка памяти в классе с 3 NSMutableArrays. Зачем? - PullRequest
0 голосов
/ 27 января 2012

У меня утечка памяти с инструментами в классе, который я создал. Это класс:

.h

#import <Foundation/Foundation.h>


@interface RDItem : NSObject {

}
@property int Id;
@property (nonatomic, retain) NSString *nombre;
@property (nonatomic, retain) NSString *thumbnail;
@property (nonatomic, retain) NSString *thumbnailPush;
@property int defaultColorId;
@property int idTema;

@property (nonatomic, retain) NSString *selectedFrame;
@property (nonatomic, retain) NSString *mergedFrame;

@property (nonatomic, retain) NSMutableArray *colors;
@property (nonatomic, retain) NSMutableArray *textures;
@property (nonatomic, retain) NSMutableArray *styles;

-(void)initialize;
@end

.m

#import "RDItem.h"


@implementation RDItem
@synthesize Id;
@synthesize nombre;
@synthesize thumbnail;
@synthesize thumbnailPush;
@synthesize defaultColorId;
@synthesize idTema;
@synthesize selectedFrame;
@synthesize mergedFrame;

@synthesize colors;
@synthesize textures;
@synthesize styles;

-(void)initialize
{
    colors = [[NSMutableArray alloc] init];
    textures = [[NSMutableArray alloc] init];
    styles = [[NSMutableArray alloc] init];
}
-(void)dealloc
{
    [colors release];
    [textures release];
    [styles release];
}
@end

В этом классе есть 3 NSMutableArray, где я буду хранить данные. Чтобы подготовить и инициализировать этот класс, я разработал метод initialize, в котором создаются 3 массива. В деаллок выпускаются.

Инструмент утечки обнаруживает утечку каждый раз, когда этот класс используется, потому что метод initialize.

Каков наилучший способ инициализации этих массивов?

Спасибо.

EDIT

Привет, я решил проблему с помощью RDItem, но теперь появляется еще один ученик в очень похожем классе:

.h

#import <Foundation/Foundation.h>

@interface RDTema : NSObject {

}
@property int Id;
@property (nonatomic, retain) NSString *idManifest;
@property (nonatomic, retain) NSString *idTema;
@property (nonatomic, retain) NSString *nombre;
@property (nonatomic, retain) NSString *thumbnail;
@property (nonatomic, retain) NSString *thumbnailPush;

@property (nonatomic, retain) NSMutableArray *items;

@property (nonatomic, retain) NSMutableArray *colors;
@property (nonatomic, retain) NSMutableArray *textures;
@property (nonatomic, retain) NSMutableArray *styles;

-(void)initialize;
@end

.m

#import "RDTema.h"


@implementation RDTema
@synthesize Id;
@synthesize idManifest;
@synthesize idTema;
@synthesize nombre;
@synthesize thumbnail;
@synthesize thumbnailPush;

@synthesize items;

@synthesize colors;
@synthesize textures;
@synthesize styles;

-(void)initialize
{
    /*
    self.items = [[NSMutableArray alloc] init];
    self.colors = [[NSMutableArray alloc] init];
    self.textures = [[NSMutableArray alloc] init];
    self.styles = [[NSMutableArray alloc] init];
     */

    self.items = [NSMutableArray array];
    self.colors = [NSMutableArray array];
    self.textures = [NSMutableArray array];
    self.styles = [NSMutableArray array];
}
-(void)dealloc
{
    [idManifest release];
    [idTema release];
    [nombre release];
    [thumbnail release];
    [thumbnailPush release];

    [items release];
    [colors release];
    [textures release];
    [styles release];

    [super dealloc];
}

Теперь я получаю утечку в следующих строках:

self.items = [NSMutableArray array];
self.colors = [NSMutableArray array];
self.textures = [NSMutableArray array];
self.styles = [NSMutableArray array];

Кто-нибудь может объяснить, почему сейчас происходит в этом классе, а не в классе RDItem? Такие же :(

Спасибо.

Ответы [ 5 ]

2 голосов
/ 27 января 2012

Это более рекомендуемая реализация

-(void)initialize
{
    self.colors = [NSMutableArray array];
    self.textures = [NSMutableArray array];
    self.styles = [NSMutableArray array];
}
-(void)dealloc
{
    self.colors = nil;
    self.textures = nil;
    self.styles = nil;
}
1 голос
/ 27 января 2012

Я думаю, что вы получаете утечку, потому что вы вызываете ваше сообщение инициализации более одного раза, и вы не освобождаете переменные.

Обычно вам следует использовать сеттеры или геттеры для доступа к вашим иварам, так что подходящиеВызываются операции (например, сообщение об освобождении перед назначением нового значения в сеттере).

И не забудьте вызвать [super dealloc] в качестве последней инструкции для вашего dealloc;)

0 голосов
/ 27 января 2012

Я думаю, что утечка в коде заполнения массивов, а не в init. Например, вы выделяете и инициируете некоторую NSString и помещаете ее в свой массив NSMutable без освобождения или автоматически выпускаете ее. Или как то так. Убедитесь, что вы правильно заполняете свои массивы.

0 голосов
/ 27 января 2012

Просто init их, когда вам это нужно. Вызов alloc и init сохраняется для массивов, содержимое которых равно nil. Позвоните alloc initWithObjects: и заполните поля.

0 голосов
/ 27 января 2012

Не видя код, где вы инициализируете RDItem, я не могу сказать наверняка.

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

...