2

whileループのあるメソッドを呼び出すスレッドを切り離します。としてマークを付けてもautoreleasepool、whileループはしばらく続く可能性があるため、オブジェクトを手動で解放します。

問題は、しばらくすると、メモリの問題が原因でアプリがクラッシュすることです。Instrumentsを見ると、NSStringの巨大な山が割り当てられており、グラフに天国への階段が作成されていることがわかります。何をリリースできませんでしたか?

while (keepGettingScores)  
{  
    NSString *jsonString = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];  
    NSDictionary *json = [jsonString JSONValue];  
    [jsonString release];   

    NSMutableArray *scores = [[NSMutableArray alloc] init];  
    [scores setArray:(NSMutableArray*)[[jsonString JSONValue] objectForKey:@"scores"]];

    NSSortDescriptor *sorter = [[NSSortDescriptor alloc] initWithKey:@"totalScore" ascending:NO];  
    [scores sortUsingDescriptors:[NSArray arrayWithObject:sorter]];  
    [sorter release];  

    [self performSelectorOnMainThread:@selector(updatePlayerTable:) withObject:scores waitUntilDone:NO];  
    [scores release];  

    [NSThread sleepForTimeInterval:1.0];  
}  
4

3 に答える 3

0

明白なものは何も表示されません。JSONライブラリの内部に問題がある可能性がありますか?

于 2010-01-20T22:21:39.020 に答える
0

スレッドの実行が終了した後、プールを空にしていますか?

スレッドの実行が終了したら、NSAutoreleasePool を作成し、そのドレイン メソッドを呼び出す必要があります。

私のプロジェクトの 1 つで、多くの自動解放オブジェクトを作成する必要があるスレッドがあり、スレッドの実行中にプールを定期的にドレインすると便利であることがわかりました。

- (void)doStuff:(NSObject *)parent {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];      

    /* Do lots of stuff *.
    /* Periodically, I'd drain and recreate the pool */
    [pool drain];
    pool = [[NSAutoreleasePool alloc] init];
    /* The rest of my stuff */

    [pool drain];
}

そして、doStuff: は detachNewThreadSelector: を使用して呼び出されます。

于 2010-01-20T22:26:18.900 に答える
0

わかりました、私が見るいくつかの大きな問題は

1

これ..

[self performSelectorOnMainThread:@selector(updatePlayerTable:) withObject:scores waitUntilDone:NO]; 他の何かによって保持される可能性があり、含まれるすべてのオブジェクトも保持される可能性のあるスコアを渡しています。

2

スコアは nsmutablearray であり、NOT THREAD SAFE として明示的に定義されていますが、スレッド間で渡しています。

3

これらの [何とか JSONvalue] のものは自動リリースする必要があり、それは Apple API ではありません。Apple には iPhone 用のパブリック JSON API がありません。これはおそらく、便利な JSON 解析のために Apple クラス (nsstring、nsarray、nsdictionary など) にカテゴリを配置する SBJSON ライブラリです。

于 2010-01-23T12:00:35.017 に答える