NSEvent утечка для ключа вниз в macOS

Я базово вычисляю мгновенную скорость, а затем использую метод setSpeed ​​(), чтобы добавить его в местоположение. Его довольно точно, потому что я сравнивал его внутри транспортного средства, где я мог проверить тахеометр.

private double calculateInstantaneousSpeed(Location location) {



    double insSpeed = 0;
    if (y1 == null && x1 <= -1) {
        //mark the location y1 at time x1
        y1 = location;
        x1 = duration.getDurationAsSeconds();


    } else {
         //mark the location y2 at time x2
        y2 = location;
        x2 = duration.getDurationAsSeconds();


        //calculate the slope of the curve (instantaneous speed)
        dy = y1.distanceTo(y2);
        dx = x2 - x1;

        insSpeed = dy / dx;

        y1 = y2;
        x1 = x2;

    }

    Singleton.getInstance().instantaneousSpeedSamples.add(insSpeed);
    //System.out.println("Instantaneous Speed m/s: "+insSpeed);
    return insSpeed;
}
0
задан Jesús Mateos Gomez 11 March 2019 в 21:53
поделиться

1 ответ

Из Apple Docs ;

. Примечание

. Монитор Block вызывается для всех будущих событий, соответствующих маске. Вы должны позвонить removeMonitor(_:), чтобы остановить монитор. При сборке мусора монитор (и все, что ссылается на Блок) не будет собираться до тех пор, пока не будет вызван removeMonitor(_:).

Это означает, что монитор будет продолжать поиск совпадающих событий, пока не будет вызвано removeMonitor(). Таким образом, ваша система использует дополнительную память для продолжения поиска событий, и если вы никогда не вызовете это - это может привести к довольно большой утечке памяти. Как говорится даже при сборке мусора, этот объект все еще выделяется - потому что он ищет события, которые могут произойти в любое время (поэтому не гарантируется, что он будет собран). Обязательно звоните, когда хотите, чтобы система перестала искать события.

Вы также можете сделать что-то подобное в вашем handler.

Вы можете вернуть событие без изменения, создать и вернуть новый объект NSEvent или вернуть nil, чтобы остановить отправку события.

0
ответ дан KSigWyatt 11 March 2019 в 21:53
поделиться
Другие вопросы по тегам:

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