Время жизни объекта malloc с типом __unsafe_unretained
Я новичок в Objective-C и ARC, и искал и читал часами, не находя ответа. Код делает то, что я хочу, но я хочу знать, что он не зависит от благоприятных условий. Вот упрощенная версия моего кода:
+(void)foo {
Class *classes = (__unsafe_unretained Class *)malloc(sizeof(Class) * someValue);
// Perform work without complicated memory management
free(classes);
}
Я не могу многое сделать со структурой, которую я выделяю. Он заполнен объектом objc_getClassList. К сожалению, Apple, похоже, не обновила свою документацию, чтобы объяснить, как это сделать в ARC. Приведенный выше типографский сюжет частично задуман при рассмотрении примеров, но он все равно заставляет меня нервничать.
Одна из моих проблем заключается в том, что если бы я выделил место для "обычного" объекта, то dealloc
был бы вызван, когда переменная выходит из области видимости, что произошло бы после free
называется. Но я не думаю, что это именно то, что здесь происходит.
- Есть ли
Class
ведут себя иначе, чем другие типы данных Objective-C? Стоит ли ожидать чего-то еще от этого? - Что это за указатель
classes
? Я предполагаю, что он ссылается на массив неизвестного размера (не указатель на объект), но ARC все еще заботится об этом, так как код не будет компилироваться без этого приведения. Это похоже на сильный указатель, но я не знаю, на что это будет сильный указатель. - Есть ли сильные указатели на объекты в массиве вообще, или сами объекты являются сильными указателями? Если нет, работает ли ARC или я должен вернуться к некоторым соглашениям MRC?
- Будет ли автоматический звонок на
dealloc
? Когда и как компилятор может это гарантировать? - Это лучше практика, чтобы установить
classes
вNULL
и только потом позвонитеfree
? Или я должен перебрать массив и сделать что-то с каждым объектом, например, установив их вnil
?
2 ответа
Вы выделяете массив указателей структуры (указатель класса == на структуру), который будет заполнен указателями на классы, зарегистрированные во время выполнения. Эти указатели не будут выпущены / освобождены и т. Д., Пока ваше приложение работает. Вы не выделяете какие-либо классы, вы выделяете пространство для хранения указателей на эти классы. Ваш код полностью в порядке, и __unsafe_unretained
это именно то, что вы хотите. Он сообщает ARC, что вы держите указатель на объект, которым вы не владеете, и, таким образом, предотвращает попытку его освобождения в конце области видимости вашей переменной.
Отличается ли Class от других типов данных Objective-C? Стоит ли ожидать чего-то еще от этого?
Class
это тип, который может содержать указатель на любой объект класса, так же, как id
это тип, который может содержать указатель на любой объект, и как NSString *
это тип, который может содержать указатель на любой объект, который является экземпляром NSString
(или его подтип). Объекты класса являются (одним видом) объектами и работают в основном так же, как и другие объекты. Тип Class
может использоваться так же, как и другие типы указателей на объекты.
Что за указатель классы? Я предполагаю, что он ссылается на массив неизвестного размера (не указатель на объект), но ARC все еще заботится об этом, так как код не будет компилироваться без этого приведения. Это похоже на сильный указатель, но я не знаю, на что это будет сильный указатель.
classes
это указатель на Class
указатель на указатель на объект класса. Вы используете его здесь, чтобы указать на первый член массива Class
, что правильно. classes
не указатель объекта, но указатель на указатель объекта; вот почему ARC заботится. Это так же, как если бы вы бросили результат malloc
в id *
или же NSString **
, Если вы не указали классификатор на Class
неявно __unsafe_unretained
, Так classes
это уже указатель на указатель на объект без сохранения.
Есть ли сильные указатели на объекты в массиве вообще, или сами объекты являются сильными указателями? Если нет, работает ли ARC или я должен вернуться к некоторым соглашениям MRC?
Будет ли автоматический звонок в dealloc? Когда и как компилятор может это гарантировать?
Class
содержит указатели на объекты класса. Объекты класса - это в основном синглтоны; они не считаются ссылками. Как правило, они живут в течение всей программы, за исключением, может быть, если класс не загружен. Нет необходимости поддерживать явную строгую ссылку на объект класса; класс останется без дела
Лучше ли устанавливать классы в NULL, и только после этого делать вызовы свободными? Или я должен перебрать массив и что-то сделать с каждым объектом, например установить для него значение nil?
Вы, очевидно, не должны устанавливать classes
NULL перед вызовом free(); таким образом, звоня free(classes);
не буду ничего делать Поскольку элементы этого массива __unsafe_unretained
нет никакого смысла устанавливать их на что-либо до освобождения памяти; это не будет иметь значения.