2

私の携帯電話で xcode から直接アプリを実行している間、すべてがうまく動作します。アーカイブしてアーカイブとして実行すると、アプリの動作が異なり、期待どおりに動作しません。これは、アーカイブから実行するときに asihttprequest が終了しない部分です。喜んでお手伝いします。

id<GAITracker> tracker = [[GAI sharedInstance] defaultTracker];

[tracker sendEventWithCategory:@"uiAction"
                    withAction:@"station pressed"
                     withLabel:@"Station number"
                     withValue:num];

NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://server.com/servlet?stationId=%d",    [num intValue]]];

__weak ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
NSLog(@"0");

[request setCompletionBlock:^{
    @try {
        NSLog(@"1");
        StopParser *stop = [[StopParser alloc]init];
                    NSLog(@"2");
        timesArray = [stop getStationsListfromString:[request responseString]];
                    NSLog(@"3");
        [stView.downlodingLabel setHidden:YES];
        [stView.downloadingIndicator setHidden:YES];
        [stView.tableview reloadData];
        [stView.tableview setHidden:NO];


    }
    @catch (NSException *exception) {
                    NSLog(@"4");
        [stView.downloadingIndicator setHidden:YES];
        [stView.downlodingLabel setHidden:NO];
        [stView.downlodingLabel setText:@"נא לנסות מאוחר יותר"];
        [stView.tableview setHidden:YES];

    }
    @finally {
        [refreshControl endRefreshing];
    }

}];
[request setFailedBlock:^{
                NSLog(@"5");
    [stView.downloadingIndicator setHidden:YES];
    [stView.downlodingLabel setHidden:NO];
    [stView.downlodingLabel setText:@"נא לנסות מאוחר יותר"];
    [stView.tableview setHidden:YES];
    [refreshControl endRefreshing];

}];
[request startAsynchronous];
4

2 に答える 2

3

__weakあなたの問題だと思います。__block代わりに使用してください。

の強い参照が保存されていないためrequest、解放されます。

ARCが新しいライフタイム修飾子を導入

  • __weak参照されるオブジェクトを存続させない参照を指定します。オブジェクトへの強い参照がない場合、弱い参照は nil に設定されます。

__block ストレージ タイプ

__block変数は、変数のレキシカル スコープと、変数のレキシカル スコープ内で宣言または作成されたすべてのブロックおよびブロック コピーとの間で共有されるストレージに存在します。したがって、フレーム内で宣言されたブロックのコピーがフレームの最後を超えて存続する場合 (たとえば、後で実行するためにどこかでキューに入れられることによって)、ストレージはスタック フレームが破棄されても存続します。特定のレキシカル スコープ内の複数のブロックは、共有変数を同時に使用できます。


アップデート

明確にするために、私の提案は次のものを置き換えることです:

__weak ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

と:

__block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

これにより保持サイクルが発生することはありません。

于 2013-04-23T15:51:21.433 に答える