2010-05-12 59 views
0

我已經注意到這個主題的幾個其他線程,並試圖包裝我的線程代碼: NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; [游泳池釋放];爲什麼我越來越*** _NSAutoreleaseNoPool():NSCFDictionary類的對象0x97480b0 autoreleased沒有到位的池 - 只是漏

但是錯誤仍然存​​在。

我正在使用靜態方法來實例化單詞字典。 下面是一些代碼:

-(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]; 
} 

有什麼我應該知道如何使用新的選擇線程靜態類的方法?

感謝您的幫助

回答

3

首先,Objective-C中沒有靜態方法。有類方法。其次,你的代碼顯示了封裝在autorelease池中的兩個方法。警告必須來自其他地方。

最後,你的代碼像篩子一樣泄漏。你沒有遵循內存管理規則。那裏有一些無意義的陳述。

具體來說:

[WordDictionary setDictionary:[[NSMutableDictionary alloc] init]]; 

除非+setDictionary:是打破了存儲器管理規則,上面的泄漏。

此聲明[NSMutableDictionary dictionaryWithContentsOfFile:filePath];實際上什麼都不做,除非您使用返回值做一些事情。

另外,mySerializer正在泄漏。

嘗試在代碼上運行分析器並修復問題。您還應該閱讀thisthis

0

[NSMutableDictionary dictionaryWithContentsOfFile:filePath];是我試圖讓字典訪問速度更快的一個實驗的一部分。我應該從這個例子中刪除它。

我剛纔讀取內存管理規則,並瞭解 [WordDictionary setDictionary:[[NSMutableDictionary alloc] init]];似乎是計劃不周實例,因爲我沒有辦法從configDictionary內釋放它作爲基準丟失。但實際上我從不想釋放它,它在我的應用程序的整個生命週期中都存在。也許不好的做法是一樣的。

mySerializer絕對應該放在底部。

我只是想知道如果類方法有關於autorelease池和內存的任何特殊規則。

我會查看你寄給我的文件,並試圖找出分析儀,謝謝你的幫助。

相關問題