重置NSMutableDictionary iVar的内容

时间:2011-06-21 18:49:59

标签: objective-c

我有一个ivar我会调用dictionaryIvar,这是一个可变字典。有时,必须删除其内容并使用新内容重置。内容会在无限数量的迭代中添加,因此它是可变的。

是否足以“重置”或释放字典:

 self.dictionaryIvar=nil;

然后在需要的其他方法中,使用以下命令重新创建字典:

 if(!self.dictionaryIvar){
 self.dictionaryIvar = [NSMutableDictionary dictionary];
 }

这是否可以接受,或者这会泄漏对象?

5 个答案:

答案 0 :(得分:4)

如果您的财产定义如下:

@property (nonatomic, readwrite, retain) NSMutableDictionary *dictionaryIvar;
//...
@synthesize dictionaryIvar;

然后合成的方法将负责释放/保留字典对象。

self.dictionaryIvar = [NSMutableDictionary dictionary];
因此

就足够了。

self.dictionaryIvardictionaryIvar之间存在区分差异,其中前者被传递给合成属性方法(分别为- (NSMutableDictionary *)dictionaryIvar;- (void)setDictionaryIvar:(NSMutableDictionary *)aDictionary;)和dictionaryIvar访问变量。

因此,这会泄漏(并且崩溃,两者):

dictionaryIvar = [NSMutableDictionary dictionary];

虽然这不会:

self.dictionaryIvar = [NSMutableDictionary dictionary];

但我(在大多数情况下)真的只是接受这个简单的电话:

[dictionaryIvar removeAllObjects];

答案 1 :(得分:1)

不是这样做,为什么不只是......

[dictionaryIvar removeAllObjects];

答案 2 :(得分:1)

如果要更改字典的内容,可以将其替换为新字典。在一行中:

[dictionaryIvar setDictionary:[NSMutableDictionary dictionary]];

这与执行[dictionaryIvar removeAllObjects](它还向其中包含的所有对象发送release)具有相同的效果,然后添加新词典中的对象(在您的情况下为空) 。

此外,通过这样做,您不必担心您的ivar的所有权和内存管理问题,如果您只需要“重置”字典......

答案 3 :(得分:0)

当你使用nil使用self.进行设置时,它不会泄露,它将调用dictionaryIvar的setter函数,然后释放先前保存的对象并指定{{1 }}

我更愿意在nil变量上调用正确的版本。

dictionaryIvar

  [dictionaryIvar release];
    dictionaryIvar = nil;

答案 4 :(得分:0)

假设您的@property设置为retain,那应该没问题。使用点符号(self.dictionaryIvar)会自动释放并保留您的词典。

如果您只是想清除字典,那么最好只调用字典的-removeAllObjects方法:

[self.dictionaryIvar removeAllObjects];