Управление памятью iOS - PullRequest
2 голосов
/ 21 октября 2011

Утечки говорят мне, что это утечка памяти, но я не уверен, почему.

TitledArray.h

@interface TitledArray : NSObject {

NSMutableArray *realArray;
BOOL uniqueTitles;
BOOL uniqueIDs;

}

@property (nonatomic) BOOL uniqueTitles;
@property (nonatomic) BOOL uniqueIDs;
@property (nonatomic, retain) NSMutableArray *realArray;

TitledArray.m

-(id)init {
return [self initWithUniqueTitles:FALSE uniqueIDs:FALSE];
}

-(id)initWithUniqueTitles:(BOOL)titles uniqueIDs:(BOOL)IDs {

if ( self = [super init] ) {
  //self.realArray = [[NSMutableArray alloc] init];
  self.realArray = [NSMutableArray array];
  self.uniqueTitles = titles;
  self.uniqueIDs = IDs;
}
return self;
}

MissionLoading.h

@interface MissionLoading : TitledObject {


TitledArray *storageWeights;
TitledArray *passengerWeights;

}


@property (nonatomic, retain) FloatArray *storageWeights;
@property (nonatomic, retain) FloatArray *passengerWeights;

MissionLoading.m

@synthesize storageWeights;
@synthesize passengerWeights;


-(id)init {
if ( self = [super init]) {


    self.storageWeights = [[TitledArray alloc] initWithUniqueTitles:FALSE uniqueIDs:TRUE];
    self.passengerWeights = [[TitledArray alloc] initWithUniqueTitles:FALSE uniqueIDs:TRUE];

}

return self;
}

-(void)dealloc{

[storageWeights release];
[passengerWeights release];

[super dealloc];
}

Код:

for (int i = 0; i < recordCount; i++)
{
    loading = [[MissionLoading alloc] init];

    // add to array

    [loading release];
}

Коренная утечка в объекте TitledArray с self.realArray = [NSMutableArray array];

Я все еще новичок в разработке под iOS, но мне это нравится. Любые мысли будут полезны. Я могу предоставить больше информации, если это необходимо.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 21 октября 2011

При присвоении свойству, которое имеет retain в объявлении @property, синтезированный установщик уже сохраняет значение, поэтому автоматически высвобождает объект, который вы назначаете этому свойству, например:

-(id)init {
    if ( self = [super init]) {
        self.storageWeights = [[[TitledArray alloc] initWithUniqueTitles:FALSE uniqueIDs:TRUE] autorelease];
        self.passengerWeights = [[[TitledArray alloc] initWithUniqueTitles:FALSE uniqueIDs:TRUE] autorelease];
    }
    // ....
}
0 голосов
/ 21 октября 2011

Похоже, у вас был //self.realArray = [[NSMutableArray alloc] init]; в иници. Сделайте чистую сборку, а затем снова запустите инструменты. Этот старый код мог быть там по какой-то причине и наверняка был бы отмечен как утечка.

Еще одна вещь, поместите self.realArray = nil в dealloc TitledArray.

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