2015-10-07 3 views
2

Небольшой контекст: мы используем CoreData и имеем классы FolderEntity и AlbumEntity, которые являются подклассами NodeEntity. Если компилировать наш код для отладки или освободить ж/весь модуль оптимизации OFF вещи работают, как и ожидалось:Ошибка всего модуля оптимизации и полиморфизма

// fetch an entity from coreData, in this case it is a FolderEntity 
// but reference it generically as a NodeEntity 
if let node = context.optionalExistingObjectWithID(currentNodeID) as? NodeEntity { 
    print(node); // correctly says its a FolderEntity 
    print(node.contentTypes()); // correctly calls FolderEntity.contentTypes() 

    if let folder = node as? FolderEntity { 
     print(folder.contentTypes()); // correctly calls FolderEntity.contentTypes() 
    } 

Вещи также работать, как ожидалось ранее, если я перехожу ON весь модуль оптимизации и компиляции для отладки , Но если я перехожу ON всего модуль оптимизации и компиляции для выпуска полиморфизм идет наперекосяк

// fetch an entity from coreData, in this case it is a FolderEntity 
// but reference it generically as a NodeEntity 
if let node = context.optionalExistingObjectWithID(currentNodeID) as? NodeEntity { 
    print(node); // correctly says its a FolderEntity 
    print(node.contentTypes()); // incorrectly calls the superclass' NodeEntity.contentTypes() 

    if let folder = node as? FolderEntity { 
     print(folder.contentTypes()); // correctly calls FolderEntity.contentTypes() 
    } 

NodeEntity (суперкласс) определяет ContentTypes(), как

func contentTypes() -> [SMContentType] { 
    return []; 
} 

FolderEntity (подкласс) определяет ContentTypes() как

override func contentTypes() -> [SMContentType] { 
    return [ SMContentType.Folder, SMContentType.Album ]; 
} 

Почему WM O беспорядок наследование, как это?

+0

«Почему» не является реальным вопросом. Какой ответ вам понравится? Поведение, которое отличается для сборки Release, является ошибкой. Сохраните файл и перейдите к нему. – matt

+0

«Если вы включите ВМО, он делает предположения X, поэтому вам нужно построить свои классы с учетом Y и Z» было бы замечательно – Shizam

+0

Ну нет таких «предположений». Поведение, которое отличается для сборки Release, является ошибкой. Думаю, я уже это сказал. И Apple хочет знать об этом. Скажи им. – matt

ответ

2

Это ошибка. Введите отчет об ошибке. Ваша ошибка может быть зафиксирована в Xcode 7.1, поэтому попробовать его там (в настоящее время в бета-версии) до подачи:

А проблемы, приводившей протокол динамической проверки конформности с использованием в качестве? Исправлен протокол об отказе во всем режиме оптимизации.

Но обязательно файл, если он не исправлен. Поведение, которое отличается для сборки Release, является ошибкой, простой и простой. Вы не должны делать ничего особенного, чтобы обойти это.

+0

Это звучит как моя проблема! – Shizam

+0

Может быть. Но, возможно, нет. :( – matt

+0

Кстати, фраза «Включить всю модульную оптимизацию и компилировать для отладки» в вашем вопросе не имеет смысла. Либо оптимизация всего модуля используется для этой сборки, либо нет. Если вы компилируете для отладки и всего модуля оптимизация включена только для версий релиза, она не включена. – matt

Смежные вопросы