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];
...