Безопасно ли создавать `NSEvent объект`, затем` CGEventPost`, `[ev CGEvent]` и затем выходить из метода? - PullRequest
0 голосов
/ 06 июля 2019

У меня есть следующий фрагмент Objective-C:

void toggle()
{
    NSEvent* down_event = [NSEvent keyEventWithType: NSEventTypeKeyDown
                                           location: NSZeroPoint
                                      modifierFlags: 0
                                          timestamp: 0.0
                                       windowNumber: 0
                                            context: nil
                                         characters: @" "
                        charactersIgnoringModifiers: @" "
                                          isARepeat: false
                                            keyCode: kVK_Space ];


    CGEventPost(kCGHIDEventTap, [down_event CGEvent]);
}

В проекте включена поддержка ARC.

Это безопасно, или я запускаю перчатку случайной ошибки доступа к памяти?

Я беспокоюсь, что NSObject может быть мусором, пока система все еще использует его CGEvent.

1 Ответ

1 голос
/ 06 июля 2019

Да, это безопасно. Документация для свойства CGEvent гласит:

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

Это говорит о том, что новый CGEvent является созданным , что соответствует NSEvent. Если была опасная зависимость, например, возвращаемое значение содержало небезопасную ссылку на исходный объект, который был бы отмечен (были / есть методы, которые делали / делают это и были / так задокументированы [да, я не проверял, существуют ли еще какие-либо)] .

Кстати: если вы выросли в эпоху ARC и не знаете, что такое «авто-релиз», не беспокойтесь, ARC знает и будет делать правильные вещи.

...