Что происходит с ARC и объектом Objective C внутри объекта C ++?

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

class SessionWriter
{
NSString *sessionDir;
...
};

Это выглядит так NSString выпущен в деструкторе ARC. Где это задокументировано?

1

Решение

Objective-C ++ в целом довольно плохо документирован. Самому языку Objective-C 2.0 не хватает формальной спецификации, кроме высокоуровневых учебных пособий Apple и низкоуровневых списков API, а в Objective-C ++ еще меньше. Вообще говоря, кажется, что вы просто должны верить, что все «работает» логически при переходе между C и C ++ в качестве базового языка.

Документы Clang ARC делают коснуться этого немного, хотя на самом деле они описывают разницу в поведении между структурами Objective-C и Objective-C ++, а не классами C ++. Это довольно ясно показывает, что ARC действительно работает для агрегатов Objective-C ++.

нетривиально принадлежащие владельцу типы считаются не POD: в терминах C ++ 11 они не являются тривиальными по умолчанию, копируемыми, конструируемыми при перемещении, назначаемыми при копировании, назначаемыми при перемещении или разрушаемыми. Это нарушение правила C ++ One Definition Rule использовать класс вне ARC, который в ARC имел бы нетривиально квалифицированный член.

обоснование

В отличие от C, мы можем выразить всю необходимую семантику ARC для квалифицированных субобъектов в виде подопераций специальных функций-членов (по умолчанию) для класса. Эти функции затем становятся нетривиальными. Это имеет неочевидный результат, что класс будет иметь нетривиальный конструктор копирования и нетривиальный деструктор; если это обычно не будет истинным за пределами ARC, объекты типа будут переданы и возвращены несовместимым с ABI способом.

2

Другие решения