дублированное объявление интерфейса для класса 'test_coredataAppDelegate'

Финализатор используется в качестве нейтрализации, если объект не расположен правильно по некоторым причинам. Обычно Dispose() метод назвали бы, который удаляет сцепление финализатора и превращает объект в регулярный управляемый объект, который легко может удалить сборщик "мусора".

Вот пример из MSDN класса, который имеет управляемые и неуправляемые ресурсы для чистки.

Уведомление, что управляемые ресурсы только очищены, если disposing верно, но неуправляемые ресурсы всегда очищаются.

public class MyResource: IDisposable
{
    // Pointer to an external unmanaged resource.
    private IntPtr handle;
    // Other managed resource this class uses.
    private Component component = new Component();
    // Track whether Dispose has been called.
    private bool disposed = false;

    // The class constructor.
    public MyResource(IntPtr handle)
    {
        this.handle = handle;
    }

    // Implement IDisposable.
    // Do not make this method virtual.
    // A derived class should not be able to override this method.
    public void Dispose()
    {
        Dispose(true);
        // This object will be cleaned up by the Dispose method.
        // Therefore, you should call GC.SupressFinalize to
        // take this object off the finalization queue
        // and prevent finalization code for this object
        // from executing a second time.
        GC.SuppressFinalize(this);
    }

    // Dispose(bool disposing) executes in two distinct scenarios.
    // If disposing equals true, the method has been called directly
    // or indirectly by a user's code. Managed and unmanaged resources
    // can be disposed.
    // If disposing equals false, the method has been called by the
    // runtime from inside the finalizer and you should not reference
    // other objects. Only unmanaged resources can be disposed.
    private void Dispose(bool disposing)
    {
        // Check to see if Dispose has already been called.
        if(!this.disposed)
        {
            // If disposing equals true, dispose all managed
            // and unmanaged resources.
            if(disposing)
            {
                // Dispose managed resources.
                component.Dispose();
            }

            // Call the appropriate methods to clean up
            // unmanaged resources here.
            // If disposing is false,
            // only the following code is executed.
            CloseHandle(handle);
            handle = IntPtr.Zero;

            // Note disposing has been done.
            disposed = true;

        }
    }

    // Use interop to call the method necessary
    // to clean up the unmanaged resource.
    [System.Runtime.InteropServices.DllImport("Kernel32")]
    private extern static Boolean CloseHandle(IntPtr handle);

    // Use C# destructor syntax for finalization code.
    // This destructor will run only if the Dispose method
    // does not get called.
    // It gives your base class the opportunity to finalize.
    // Do not provide destructors in types derived from this class.
    ~MyResource()
    {
        // Do not re-create Dispose clean-up code here.
        // Calling Dispose(false) is optimal in terms of
        // readability and maintainability.
        Dispose(false);
    }
}
24
задан Matthias Bauch 10 March 2015 в 07:35
поделиться

2 ответа

Есть две возможности:

  • у вас есть два интерфейса с одинаковым именем. Используйте поиск Xcode в меню проекта, чтобы найти экземпляры test_coredataAppDelegate. Затем переименуйте один из интерфейсов
  • так, как вам удалось дважды импортировать файл .h. Убедитесь, что вы всегда используете #import, а не #include.

Редактировать:

Немного больше информации о #import / #include:

#include вслепую включает файл в расположении #include заявление. Это означает, что если вы дважды #include файл в своем .m, вы получите две копии файла. Почти все традиционные файлы C #include имеют что-то вроде следующего заключенного в скобки всего содержимого:

// some_file.h
#if !defined SOME_FILE_H
#define SOME_FILE_H

//  entire content of #include file

#endif

Выше иногда упоминается как макрос включения защиты.

В Objective-C, если вы #import файл, компилятор выполняет проверку, чтобы убедиться, что он еще не был импортирован. Следовательно, охранники обычно опускаются. Так что если вы #include файл, который должен был #import редактировать, ни одна проверка не будет выполнена, и вы иногда получите дубликаты определений.

59
ответ дан 28 November 2019 в 22:24
поделиться

Я удалил класс модели даты, создал новый и исправил проблему. также удалить из каталога проекта.

0
ответ дан 28 November 2019 в 22:24
поделиться
Другие вопросы по тегам:

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