我已经注意到有关此主题的其他几个主题,并尝试使用以下内容包装我的线程代码: NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; [池发布];
但错误仍然存在。
我使用静态方法来实例化单词字典。 这是一些代码:
-(id)init
[NSThread detachNewThreadSelector:@selector(loadDictionary:) toTarget:[IntroScreen class] withObject:nil];
[NSThread setThreadPriority:1.0];
return self;
}
+(void)loadDictionary:(id)param
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
[[SimpleAudioEngine sharedEngine] preloadEffect:@"click.wav"];
[[SimpleAudioEngine sharedEngine] preloadEffect:@"pop.wav"];
[[SimpleAudioEngine sharedEngine] preloadEffect:@"dink.wav"];
[[SimpleAudioEngine sharedEngine] playBackgroundMusic:@"musicloop.wav"];
[WordDictionary configDictionary];
[pool release];
}
+(void)configDictionary
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
Serializer * mySerializer = [[Serializer alloc] init];
[WordDictionary setDictionary:[mySerializer readApplicationPlist:@"x"]];
NSString * string;
NSString *filePath = [[[NSBundle mainBundle] resourcePath]
stringByAppendingPathComponent:@"x.txt"];
NSString *info = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
NSArray *arrayOfLines = [info componentsSeparatedByString:@"\r\n"];
[WordDictionary setDictionary:[[NSMutableDictionary alloc] init]];
[NSMutableDictionary dictionaryWithContentsOfFile:filePath];
int len = [arrayOfLines count];
for(int i = 0; i < len; i++)
{
string = [arrayOfLines objectAtIndex:i];
NSString * blankString = [NSString stringWithString:@""];
[[WordDictionary dictionary] setObject:blankString forKey:string];
double calc = ((double)i / (double)len) * 100.0;
[WordDictionary setProgress:(int)calc];
}
[mySerializer writeApplicationPlist:[WordDictionary dictionary] toFile:@"s"];
[WordDictionary setProgress:100];
[pool release];
}
对于使用带有新选择器线程的静态类方法,我应该知道些什么吗?
感谢您的帮助
答案 0 :(得分:3)
首先,Objective-C中没有静态方法。有类方法。
其次,您的代码显示了自动释放池中包含的两个方法。警告必须来自其他地方。
最后,你的代码像筛子一样泄漏。您没有遵循内存管理规则。那里有一些无意义的陈述。
具体做法是:
[WordDictionary setDictionary:[[NSMutableDictionary alloc] init]];
除非+setDictionary:
违反内存管理规则,否则上述泄漏。
除非您使用返回值执行某些操作,否则此语句[NSMutableDictionary dictionaryWithContentsOfFile:filePath];
实际上无效。
此外,mySerializer
正在泄露。
答案 1 :(得分:0)
啊,[NSMutableDictionary dictionaryWithContentsOfFile:filePath];
是实验的一部分,我试图让字典访问速度更快。我应该从这个例子中删除它。
我刚刚阅读了内存管理规则,并了解这一点
[WordDictionary setDictionary:[[NSMutableDictionary alloc] init]];
似乎是计划不当的实例化,因为我无法在configDictionary
内释放它,因为参考丢失了。但实际上我并不想释放它,它会在我的应用程序的整个生命周期中存在。可能也是不好的做法。
mySerializer
绝对应该在底部发布。
我只是想知道类方法是否有关于自动释放池和内存的特殊规则。
我会查看您发给我的文件并尝试找出分析仪,谢谢您的帮助。