我有一个包含mutableDictionary的单例类。我在我的根viewController中初始化字典。后来我想清空字典并释放内存。即使保留计数为1,释放也会导致崩溃:
- [CFDictionary release]:发送到解除分配的实例的消息
是否可以释放单身人士属性?
由于
答案 0 :(得分:4)
首先,我要重申在这里说了很多次:不要打{{1}} !!这是一个实现细节。
请参阅:StackOverflow | when to use retainCount,了解您不使用retainCount的原因。
除此之外,我建议您查看有关invariants to shoot for in writing singletons的更多信息。 Dave DeLong对某种方式(以及更重要的是他为什么做单身人士)有一个很好的回顾。该文章包含指向其他开发人员及其前景的链接。我建议您熟悉这些原则,然后重新评估您的实施。
最后,再说一次:
请所有人转到http://bugreport.apple.com并请求弃用-retainCount
。要求的人越多越好。
答案 1 :(得分:1)
您不应该释放其他对象的属性。允许单例管理字典本身,您的设计将更简单。
至于Cocoa说你过度释放的问题,即使“保留计数是1”,你只能得到一条关于保留计数的好建议:
它们具有欺骗性,并且对象的实际内存管理受到保留计数无法告诉您的各种力量的影响。
在这种情况下,您正在检查保留计数以查看对象是否仍然存在。但是没有保留计数为0的对象 - 当你释放一个保留计数为1的对象时,它会被释放。从解除分配的对象返回的任何结果都是垃圾,因此您永远无法向对象请求其保留计数并返回0 - 保留计数为0的对象实际上不存在。
答案 2 :(得分:0)
分配的任何对象都可以在以后发布。听起来你过度释放了。检查您的属性和对象的所有引用,以确保您不会过度释放它。如果字典在单例类中,单例类应该负责释放它,而不是客户视图控制器。
答案 3 :(得分:0)
同意评论retainCount
。只是不要这样做。
在单件
根据需要在其他类
空字典的开销是微不足道的,我不担心空的时候释放它
在需要时使用[dictionary removeAllObjects]
删除所有内容
如果字典存储了您想要在内存警告时释放的对象,请让单例观察UIApplicationDidReceiveMemoryWarningNotification
并将其删除所有对象。
如果你真的希望你的实现发布整个字典,我会覆盖合成的getter并添加单例方法与字典交互,如下所示:
在MySingleton.m中:
- (NSMutableDictionary *)myDictionary
{
if (!_myDictionary) {
_myDictionary = [[NSMutableDictionary alloc] init];
}
return _myDictionary;
}
- (void)setObject:(id)object inMyDictionaryForKey:(NSString *)key
{
[self.myDictionary setObject:object forKey:key];
}
- (void)removeObjectInMyDictionaryForKey:(NSString *)key
{
[self.myDictionary removeObjectForKey:key];
if ([self.myDictionary count] == 0) {
self.myDictionary = nil;
}
}
- (void)removeAllObjectsFromMyDictionary
{
self.myDictionary = nil;
}