Почему не там никакой пул автовыпуска, когда я делаю performSelectorInBackground:?

Я добавил автоматическое отклонение с оставшимся временем, показанным в тексте положительной кнопки, к AlertDialog.

AlertDialog dialog = new AlertDialog.Builder(getContext())
        .setTitle(R.string.display_locked_title)
        .setMessage(R.string.display_locked_message)
        .setPositiveButton(R.string.button_dismiss, null)
        .create();

dialog.setOnShowListener(new DialogInterface.OnShowListener() {
    @Override
    public void onShow(DialogInterface dialog) {
        final Button positiveButton = ((AlertDialog) dialog).getButton(AlertDialog.BUTTON_POSITIVE);
        final CharSequence positiveButtonText = positiveButton.getText();
        new CountDownTimer(AUTO_DISMISS_MILLIS, 100) {
            @Override
            public void onTick(long millisUntilFinished) {
                positiveButton.setText(String.format(Locale.getDefault(), "%s (%d)",
                        positiveButtonText,
                        TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) + 1));
            }

            @Override
            public void onFinish() {
                dismiss();
            }
        }.start();

    }
});
5
задан PengOne 2 June 2011 в 05:18
поделиться

2 ответа

Скорее всего, причина этого в том, что утечка объекта (NSNumber) является параметром, переданным извне потока. Следовательно, эта переменная принадлежит вызывающему потоку (и его пулу автозапуска)

Причина, по которой пул автозапуска вокруг вызова потока не работает, заключается в том, что создатель потока (performSelectorInbackground) - возвращает немедленно, скорее всего, пока поток все еще работает.

Я предлагаю вам освободить параметр вашего селектора после его передачи в качестве аргумента.

7
ответ дан 13 December 2019 в 22:15
поделиться

Я согласен с тем, что, скорее всего, причина этого в том, что объект утечки (NSNumber) является параметром, переданным извне потока. Следовательно, эта переменная принадлежит вызывающему потоку (и его пулу автозапуска)

Вызывающий поток должен использовать NSAutoreleasePool и я предлагаю вам добавить к параметру инструкцию сохранения:

- (void) loadViewControllerWithIndex:(NSNumber *)indexNumberObj {
    NSAutoreleasePool *arPool = [[NSAutoreleasePool alloc] init];
    [indexNumberObj retain];

    ....

    [arPool release];
  }
3
ответ дан 13 December 2019 в 22:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: