Как я могу записать модульный тест, чтобы определить, может ли объект быть собран "мусор"?

Я не уверен на 100%, чего ты хочешь достичь. Этот код откроет клавиатуру при нажатии кнопки и покажет textField только тогда, когда пользователь начнет печатать.

Когда кнопка нажата, мы устанавливаем скрытый ответчик textField в true. Таким образом, мы поднимаем клавиатуру, не показывая textField. Когда пользователь начинает печатать, мы открываем текстовое поле и изменяем его ограничения, чтобы они были над клавиатурой.

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var button: UIButton!
    @IBOutlet weak var textField: UITextField!
    @IBOutlet weak var textFieldBottomConstraint: NSLayoutConstraint!

    var keyboardHeight: CGFloat = 0

    override func viewDidLoad() {
        super.viewDidLoad()
        button.addTarget(self, action: #selector(buttonPressed), for: .touchUpInside)
        textField.isHidden = true
        textField.delegate = self

        NotificationCenter.default.addObserver(
            self,
            selector: #selector(keyboardWillShow),
            name: UIResponder.keyboardWillShowNotification,
            object: nil
        )
    }

    @objc func buttonPressed() {
        textField.becomeFirstResponder()
    }

    @objc func keyboardWillShow(_ notification: Notification) {
        if let keyboardFrame: NSValue = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue {
            let keyboardHeight = keyboardFrame.cgRectValue.height
            self.keyboardHeight = keyboardHeight
        }
    }
}

extension ViewController: UITextFieldDelegate {
    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        textField.isHidden = false
        textFieldBottomConstraint.constant = keyboardHeight
        return true
    }
}
36
задан Community 23 May 2017 в 11:46
поделиться

3 ответа

Это - то, что я обычно делаю:

[Test]
public void MyTest() 
{
    WeakReference reference;
    new Action(() => 
    {
        var service = new Service();
        // Do things with service that might cause a memory leak...

        reference = new WeakReference(service, true);
    })();

    // Service should have gone out of scope about now, 
    // so the garbage collector can clean it up
    GC.Collect();
    GC.WaitForPendingFinalizers();

    Assert.IsNull(reference.Target);
}

NB: Там очень, буквально несколько раз, где необходимо назвать GC.Collect () в производственном приложении. Но тестирование на утечки является одним примером того, где это является соответствующим.

82
ответ дан Paul Stovell 27 November 2019 в 05:28
поделиться

Возможно, Вы могли держать WeakReference к нему и затем проверить, чтобы видеть что он больше живой (т.е.! IsAlive) после того, как тесты завершились.

4
ответ дан denis phillips 27 November 2019 в 05:28
поделиться

Это не ответ, однако можно хотеть попытаться выполнить код и в Отладка и в режимы Release (для пользы сравнения).

, По моему опыту, Отладка версия кода JIT'ed сделана легче отладить и таким образом может видеть, что ссылки остаются в живых дольше (я живо функционирую объем), Однако кодируют JITed в [1 111], режим Release может иметь объекты, готовые к набору быстро, после того как это вне объема и если Набор происходит.

Также не ответ на Ваш вопрос: :-)
я интересовался бы наблюдением, что Вы отлаживаете этот код с помощью Visual Studio в режиме Interop (Управляемый и Собственный компонент) и затем повреждаясь после отображения окна сообщения или чего-то. Затем можно открыть Debug-> Windows-Immediate и затем тип

load sos
(Change to thread 0)
!dso
!do <object>
!gcroot <object> (and look for any roots)

(или можно использовать Windbg, поскольку других отправили в предыдущих сообщениях)

Спасибо, Aaron

1
ответ дан AaronBa 27 November 2019 в 05:28
поделиться
Другие вопросы по тегам:

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