0

このトピックに関する他のいくつかのスレッドに注目し、スレッド化されたコードを次のようにラップしようとしました。[プール解放];

しかし、エラーはまだ発生します。

単語の辞書をインスタンス化するために静的メソッドを使用しています。ここにいくつかのコードがあります:

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

新しいセレクター スレッドでの静的クラス メソッドの使用について知っておくべきことはありますか?

ご協力ありがとうございました

4

2 に答える 2

3

まず、Objective-C には静的メソッドがありません。クラスメソッドがあります。

次に、コードは、自動解放プールにラップされた両方のメソッドを示しています。警告はどこかから来ているに違いありません。

最後に、コードがふるいのように漏れます。メモリ管理規則に従っていません。そして、そこにはいくつかのナンセンスなステートメントがあります。

具体的には:

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

メモリ管理規則に違反していない限り+setDictionary:、上記はリークします。

このステートメント[NSMutableDictionary dictionaryWithContentsOfFile:filePath];は、戻り値で何かを行わない限り、事実上何もしません。

また、mySerializer漏れています。

コードに対してアナライザーを実行し、問題を修正してみてください。thisthisも読む必要があります。

于 2010-05-12T16:46:26.597 に答える
0

ああ、[NSMutableDictionary dictionaryWithContentsOfFile:filePath];辞書へのアクセスを高速化しようとしていた実験の一部でした。この例から削除する必要がありました。

メモリ管理ルールを読みましたが 、参照が失われるため[WordDictionary setDictionary:[[NSMutableDictionary alloc] init]];内部から解放する方法がないため、インスタンス化の計画が不十分であるように見えることを理解しています。configDictionaryしかし、実際にはリリースしたくありません。アプリケーションの存続期間全体にわたって存続します。おそらく同じように悪い習慣です。

mySerializer必ず最下位でリリースする必要があります。

クラスメソッドに自動解放プールとメモリに関する特別なルールがあるかどうか疑問に思っていました。

お送りいただいた書類を確認し、Analyzer について調べてみます。ご協力ありがとうございます。

于 2010-05-13T16:12:33.123 に答える