Squeak.ru - шаблоны программирования

ARC убивает мой локальный метод NSOpenSavePanelDelegate, прежде чем я смогу его использовать. Есть ли исправление?

Я использую делегат приложения в качестве файлового фильтра с открытой панелью. Это выглядело как слишком много проблем, поэтому я разделил код делегата панели на новый класс. При настройке моих объектов NSOpenPanel я назначаю их делегата объекту, который я alloc/init тут же назначаю.

Я использую -panel:validateURL:error:, который срабатывает, когда я нажимаю кнопку «Открыть», чтобы, возможно, сказать, что данный файл не разрешен. Вместо этого я получаю сбой, EXEC_BAD_ACCESS. Когда я добавил методы init и dealloc для вызова NSLog, оба жизненных метода вызываются до открытия панели.

Есть ли какая-то необычная настройка, позволяющая локальному объекту выжить при вызове панели и ответе блока? Или мне нужно вернуться к какому-то глобальному экземпляру делегата?


Ответы:


1

назначьте их делегата объекту, который я выделяю/инициирую прямо здесь.

Большинство назначений делегатов слабые, поэтому ARC быстро их отбрасывает.

Задайте себе вопрос «что имеет сильную ссылку на делегат» или «кому принадлежит этот объект».

В вашем случае это ничего.

Самый простой способ исправить это — добавить делегата в качестве свойства того, что создает панель.

@property MyDelegateObject *ownedDelegate;

23.08.2014
  • Это тоже работает. Но это говорит о том, что делегат должен быть относительно глобальным для метода. Поскольку я создаю несколько экземпляров этого нового местоположения, я мог бы также переместить делегата обратно в глобальный экземпляр приложения. 23.08.2014
  • По-разному. Используются ли ваши файловые фильтры где-либо, кроме ваших открытых панелей? Использование и отбрасывание объектов лучше, чем превращение делегата приложения в свалку для всех тех вещей, с которыми вы не знаете, что делать. Ваша интуиция относительно SOC очень верна. вы всегда можете обнулить делегата, когда ваша панель сбрасывается. 23.08.2014
  • Каждый из моих подклассов NSWindowController и NSDocumentController имеет действие -openDocument:. Поскольку делегат не имеет состояния, а контроллер-документ является глобальным для приложения, я переместил делегат в общедоступное свойство контроллера-документа, чтобы любой оконный контроллер мог получить его по мере необходимости. 24.08.2014

  • 2

    Используете ли вы один из асинхронных методов с блоком обработчика завершения, beginSheetModalForWindow:completionHandler: или beginWithCompletionHandler:? Если это так, просто поместите ссылку на ваш объект делегата в обработчик завершения. Например, вызовите для него -self в бесполезном операторе.

    23.08.2014
    Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...