我有一个ivar我会调用dictionaryIvar,这是一个可变字典。有时,必须删除其内容并使用新内容重置。内容会在无限数量的迭代中添加,因此它是可变的。
是否足以“重置”或释放字典:
self.dictionaryIvar=nil;
然后在需要的其他方法中,使用以下命令重新创建字典:
if(!self.dictionaryIvar){
self.dictionaryIvar = [NSMutableDictionary dictionary];
}
这是否可以接受,或者这会泄漏对象?
答案 0 :(得分:4)
如果您的财产定义如下:
@property (nonatomic, readwrite, retain) NSMutableDictionary *dictionaryIvar;
//...
@synthesize dictionaryIvar;
然后合成的方法将负责释放/保留字典对象。
self.dictionaryIvar = [NSMutableDictionary dictionary];
因此就足够了。
self.dictionaryIvar
和dictionaryIvar
之间存在区分差异,其中前者被传递给合成属性方法(分别为- (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];