Утечка памяти при копировании в iOS NSDictionary - PullRequest
2 голосов
/ 23 ноября 2010

У меня две проблемы, у меня есть один метод, который создает словарь, затем я сохраняю его в глобальной переменной, которую я синтезировал. Если я просто назначаю его, когда я пытаюсь получить доступ к нему из другого метода, он пуст, если я использую копирование, это приводит к утечке памяти.

Я могу просто назначить его, и он работает, если его, скажем, «более простой» объект, такой как NSString, почему это не работает с NSDictionary?.

.h:

@interface ClassIHate : UIViewController{
 NSDictionary *postBuild;
}
@property (nonatomic, retain) NSDictionary *postBuild;
-(void)prepData;
@end

Я включаю только те классы, которые используют переменную postBuild, так как это моя проблема. .m

@implementation ClassIHate
@synthesize postBuild;

- (void)viewDidUnload {
 postBuild = nil;
}

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

-(void)prepData{
    NSInteger i = 0;
 NSMutableDictionary *_postBuild = [[NSMutableDictionary alloc]initWithCapacity:0];
 for (NSString *key in self.keys) {
        NSMutableArray *array = [ops valueForKey:key];
     NSInteger j = 0;
        for (MyDataType *object in array) {
   NSString *abc = object.abc;
   UITableViewCell *cell = [table cellForRowAtIndexPath:[NSIndexPath indexPathForRow:j inSection:i]];
   UITextView *tv = (UITextView *)cell.accessoryView;
   NSString *mon = tv.text;
   NSString *monFormat = [[NSString stringWithFormat:@"%.2lf",[mon doubleValue]]stringByReplacingOccurrencesOfString:@"." withString:@","];
   [_postBuild setObject:monFormat forKey:abc];
   j++;
        }
  i++;
    }
 //postBuild = _postBuild; //Empty when called in other method
        postBuild =  [_postBuild copy]; //Leaks memory
 [_postBuild release];
}

-(void)realizarOperaciones{
 //DO STUFF
 NSArray *postKeys = [postBuild allKeys]; //postBuild is nil if I dont use copy, leaks memory if I do.
        //DO STUFF
}

В чем может быть проблема здесь? Спасибо, Стефано.

Ответы [ 2 ]

3 голосов
/ 23 ноября 2010

Это:

postBuild =  [_postBuild copy]; //Leaks memory
[_postBuild release];

Должно быть так:

[self setPostBuild:_postBuild];
[_postBuild release];

Вам нужно вызвать метод синтезированного сеттера ( так, как вы хотите, ), чтобы это работало и чтобы retainCount было 1.

2 голосов
/ 24 ноября 2010

Я знаю, что ответ уже принят, но он не совсем корректен.

postBuild =  [_postBuild copy]; //Leaks memory
[_postBuild release];

на самом деле нормально, если вы вызываете метод только один раз.Чтобы предотвратить утечку при втором и последующих вызовах на prepData, вам нужно сначала выпустить postBuild или использовать перезапись Джейкоба.Для postBuild установлена ​​копия _postBuild, которой вы владеете, и _postBuild затем корректно освобождается.

Существует также утечка, вызванная этим:

- (void)viewDidUnload {
 postBuild = nil;
}

Помните, что у вас есть postBuild, но у вас естьпросто установите его на ноль, не отпуская его.Вам нужно сделать это вместо:

- (void)viewDidUnload {
    [self setPostBuild: nil];
}
...