iOS NSDictionary复制内存泄漏

时间:2010-11-23 20:19:24

标签: iphone objective-c memory-management memory-leaks nsdictionary

我有两个问题,我有一个构建字典的方法,然后我将它保存到我合成的全局变量中。如果我只是分配它,当我尝试从另一个方法访问它时,它是空的,如果我使用副本,它会泄漏内存。

我可以分配它,如果它可以说是一个像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 个答案:

答案 0 :(得分:3)

此:

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

应该是这样的:

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

您需要调用合成的setter方法(however way you want)才能使其生效并将retainCount保持在1

答案 1 :(得分:2)

我知道答案已被接受,但这并不完全正确。

postBuild =  [_postBuild copy]; //Leaks memory
[_postBuild release];
如果你只调用一次方法,

实际上是可以的。要阻止它在第二次和后续调用prepData时泄漏,您需要先释放postBuild或使用Jacob的重写。 postBuild设置为您拥有的_postBuild的副本,然后正确释放_postBuild。

由此导致的泄漏:

- (void)viewDidUnload {
 postBuild = nil;
}

请记住,您拥有postBuild,但您只是将其设置为nil而不释放它。你需要这样做:

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