Передача данных в обратный вызов события Cocoa Quartz - неправильное приведение из void * - PullRequest
0 голосов
/ 01 ноября 2011

Я пишу простую программу регистрации в Какао.

Я создаю функцию обратного вызова для записи нажатых клавиш в файл, но тут возникает проблема.У меня есть обработчик файлов в моем AppDelegate, и я не могу добраться до него из функции обратного вызова.

Я пытался передать его внутрь с помощью последнего параметра функции обратного вызова (void*), но внутри я должен привести его обратно к NSFileHandle - но чтобы сделать это, я должен "перебросить" его,Но использую ли я __bridge или __bridge_transfer, программа падает.

Я новичок в Objective-C, поэтому, возможно, я упускаю что-то очевидное, но я искал "все" в Интернете, Кварцевые ссылки, Стекпереполнен и погуглил на несколько часов, поэтому я буду признателен за каждый совет.

Спасибо - M

1 Ответ

0 голосов
/ 02 ноября 2011

Я удивлен, что приведение к void * (при создании касания) вообще разрешено. Разве компилятор не выдаст вам ошибку? Спецификация ARC говорит, что это верботен.

Наличие указателя void в качестве единственной надежной ссылки на объект - это анти-паттерн. Либо этот объект должен быть владельцем (в данном случае) крана события, либо объект должен владеть как краном, так и объектом, который необходимо сохранить живым. Присвоение события событию владельцу, а не владельцу, с большей вероятностью будет работать во всех разработанных схемах управления памятью, что делает более чистый код побочным преимуществом.

(Это также относится к NSOpenPanels и NSSavePanels в коде предварительной блокировки.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...