Утечка памяти в initWithFrame - PullRequest
0 голосов
/ 29 марта 2011

Я использую подкласс UIView с NSMutableArray других представлений, чтобы указать значения в виде столбцов.
Я инициирую это в моем initWithFrame. После нескольких операций создания и удаления моего подкласса UIView Instruments сообщает об утечке при выделении NSMutableArray.
Вот почему я подставил его, чтобы избежать нескольких объектов. Но не помогает

- (id) initWithFrame :(CGRect)frame
{
self = [super initWithFrame:frame];
if (self.uiValueSubviews == nil){
    self.uiValueSubviews = [[NSMutableArray alloc]init];
}
return self;
}

- (void)dealloc {
[self.uiValueSubviews release];
[super dealloc];
}

Я что-то не так делаю с dealloc?
Спасибо за вашу помощь

Ответы [ 3 ]

5 голосов
/ 29 марта 2011

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

  1. Свойства всегда должны быть установлены на autorelease d объект или объект, который вы будете освобождать самостоятельно.
  2. Никогда не отправляйте релиз напрямую в собственность.Я предпочитаю освобождать базовую переменную, если это возможно (например, [_uiValueSubviews release];)

Измените код на следующий.

- (id) initWithFrame :(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self.uiValueSubviews == nil){
        //Set to autoreleased array
        self.uiValueSubviews = [NSMutableArray array];
    }
    return self;
}

- (void)dealloc {
    //nil the value
    self.uiValueSubviews = nil;
    [super dealloc];
}
1 голос
/ 29 марта 2011

Другим способом, избегающим автоматически выпущенных объектов, будет:

// ...
if (self.uiValueSubviews == nil)
{
    NSMutableArray *uiValueSubviews_tmp = [[NSMutableArray alloc] init];
    // maybe do something with uiValueSubviews_tmp
    self.uiValueSubviews = uiValueSubviews_tmp;
    [uiValueSubviews_tmp release];
}
// ....

Насколько я знаю, именно так Apple делает это в своих примерах.

1 голос
/ 29 марта 2011

Вы должны сделать так:

- (id) initWithFrame :(CGRect)frame
{
   if ((self = [super initWithFrame:frame]))
   {
     if (self.uiValueSubviews == nil){
         uiValueSubviews = [[NSMutableArray alloc]init];
   }
   return self;
}

- (void)dealloc 
{
   self.uiValueSubviews = nil;
   [super dealloc];
}

Вы uiValueSubviews, вероятно, свойство сохранения, поэтому, когда вы выделяете, ваш retainCount равен +1 и сам.+1 тоже.

...