我有两个问题,我有一个构建字典的方法,然后我将它保存到我合成的全局变量中。如果我只是分配它,当我尝试从另一个方法访问它时,它是空的,如果我使用副本,它会泄漏内存。
我可以分配它,如果它可以说是一个像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
}
这可能是什么问题? 谢谢,斯特凡诺。
答案 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];
}