Objective c 静态NSMutableDictionary是;“只是漏水”;

Objective c 静态NSMutableDictionary是;“只是漏水”;,objective-c,ios,xcode,macos,Objective C,Ios,Xcode,Macos,下面是一个简单的类: #import "One.h" #import "Two.h" @implementation DataFileRegistrar static NSMutableDictionary *elementToClassMapping; + (void)load { [self registerClass:[One class] forElement:@"one"]; [self registerClass:[Two class] forElement:@

下面是一个简单的类:

#import "One.h"
#import "Two.h"

@implementation DataFileRegistrar

static NSMutableDictionary *elementToClassMapping;

+ (void)load
{
    [self registerClass:[One class] forElement:@"one"];
    [self registerClass:[Two class] forElement:@"two"];
}

+ (void)registerClass:(Class)class forElement:(NSString *)element
{
    if (!elementToClassMapping) {
        elementToClassMapping = [NSMutableDictionary dictionaryWithObject:class forKey:element];
    } else {
        [elementToClassMapping setValue:class forKey:element];
    }
}

+ (id)classForElement:(NSString *)element
{
    return [elementToClassMapping valueForKey:element];
}

@end
问题在于此编译器消息:

objc[7172]:类的对象0x6840720\uu NSCFDictionary在没有池的情况下自动释放-只是泄漏-在objc\u autoreleasenool()上中断以进行调试

知道发生了什么事吗


基本上,我想要一个简单的类,包含两个类方法和一个静态字典。它总是在没有实例化的情况下使用。我想在应用程序启动后立即使用它做一些事情,然后我想释放它的内存。我认为ARC可以解决这个问题。

您不应该在静态变量上使用自动删除对象

换行

 elementToClassMapping = [NSMutableDictionary dictionaryWithObject:class forKey:element];


也不要从第二个线程调用
+(void)registerClass:(Class)Class forElement:(NSString*)元素
,而不创建自动释放池。

您的类的
+load
正在调用调用
自动释放
的方法

您的类在
main
之前加载

您可以在
+load
中显式创建自动释放池:

+ (void)load
{
    @autoreleasepool {
        [self registerClass:[One class] forElement:@"one"];
        [self registerClass:[Two class] forElement:@"two"];
    }
}
但是,在
main
中创建任何线程之前,通常最好明确地保证程序初始化和加载的顺序:

int main(int argc, const char * argv[]) {
  @autoreleasepool {
      [DataFileRegistrar initializeStaticStuff];
      ...

你在那里做的是把字典放在堆栈上(坦白说,这很愚蠢,因为你有很多方法不这么做),它会泄漏,因为它永远不会从堆栈中被释放

NSDictionary是为与自动释放池一起使用而创建的(是的..我知道有些情况下使用静态池更好,但这些情况非常罕见)


声明
NSMutableDictionary*elementToClassMapping在接口中,一切正常

这与堆栈无关。分析不正确,建议的修复程序不正确。效果很好!谢谢!自动释放的对象很好;但未恢复的自动释放对象不是。:)您仍然可以使用`dictionaryWithObject:forKey:;它只是需要保留,你的权利。但当我想避免自动释放时,我会正确地执行:)。顺便说一句:建议您重新编写使用两个自动删除的对象[NSArray实例]……从风格上来说,我更喜欢继续使用带有ObjectsSandKeys的字典并保留它,正如bbum所说,但我的编译器一直显示错误,直到我改为InitWithObjectsSandKeys,正如Jonas所示。
int main(int argc, const char * argv[]) {
  @autoreleasepool {
      [DataFileRegistrar initializeStaticStuff];
      ...