Какие объекты я выделяю / освобождаю

в Objective-C и, проще говоря - правильно ли я предполагаю

  1. что все переменные-указатели должны быть освобождены, когда они больше не используются?
  2. Каждая переменная-указатель (*) - это какой-то класс или нет?
  3. Следовательно, каждая переменная-указатель должна быть выделена и инициализирована с использованием «alloc» и «init» (или аналогичных)?
  4. При объявлении переменных с использованием методов объекта мне могут не понадобиться "alloc" или "init"?
  5. Объявления чисел (BOOL, int, float и т. Д.) Не требуют управления памятью, если они не объявлены как указатели?

Спасибо за любой совет, помогающий разобраться в моей путанице iFloh


person iFloh    schedule 04.03.2010    source источник


Ответы (3)


1) что все переменные-указатели должны быть освобождены, когда они больше не используются?

Это зависит от того, являетесь ли вы «владельцем» остроконечной вещи. Я рекомендую вам внимательно прочитать эти Управление памятью правила, чтобы узнать, как освободить указатель.

2) Каждая переменная-указатель (*) - это какой-то класс или нет?

Не всякие указатели. Переменная-указатель может содержать указатель на объект или на блок памяти. Это просто указатель на что-то.

3) Следовательно, каждая переменная-указатель должна быть выделена и инициализирована с использованием «alloc» и «init» (или аналогичных)?

Не всякие указатели. Переменная-указатель может содержать указатель на объект или на блок памяти. Указанный объект может быть уже существующим объектом или выделенным фрагментом памяти.

4) При объявлении переменных с использованием методов объекта мне могут не понадобиться "alloc" или "init"?

Не всегда. Вы можете получить указатель на существующий объект, не зная, кто его выделил и инициализировал. Опять же, необходимо соблюдать некоторые правила владения. Я рекомендую вам внимательно прочитать эти Управление памятью правила.

5) Объявления чисел (BOOL, int, float и т. Д.) Не требуют управления памятью, если они не объявлены как указатели?

да. Они называются примитивными типами, и пока вы манипулируете ими как значениями, вам не нужно заниматься управлением их памятью.

person Laurent Etiemble    schedule 04.03.2010

что все переменные-указатели должны быть освобождены, когда они больше не используются?

Только в том случае, если «переменная-указатель» указывает на экземпляр класса Objective-C, и только если вы предварительно сохранили этот экземпляр. Прочтите это: Руководство по управлению памятью.

Каждая переменная-указатель ( **) является каким-то классом, или нет? *

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

Следовательно, каждая переменная-указатель должна быть выделена и инициализирована с помощью "alloc" и "init" (или аналогичных)?

Только если указатель указывает на экземпляр класса Objective-C. Если это структура C, вы можете использовать malloc(). Даже в случае класса Objective-C вы не можете alloc ничего:

NSString * foo = [NSString stringWithFormat: @ "Привет,% @", @ "Мир!"]; NSString * bar = @ "бар"; NSBundle * main = [NSBundle mainBundle];

(Кстати: ничто из вышеперечисленного не требует -release.)

При объявлении переменных с помощью методов объекта мне могут не понадобиться "alloc" или "init"?

Этот вопрос указывает на то, что вам следует читать - и перечитывать (я читал его примерно раз в 18 месяцев в течение первого десятилетия, когда я писал код Objective-C, каждый раз изучая что-то) - руководство по языку Objective-C.

Вам, вероятно, также следует прочитать что-нибудь о самом языке C. Это, вероятно, поможет вам понять, как указатели отличаются от других типов.

Объявления чисел (BOOL, int, float и т. д.) не требуют управления памятью, если они не объявлены как указатели?

Да, но это намного проще, чем зависеть от типа. Когда вы говорите int foo;, вы говорите компилятору выделить немного места в локальной области видимости - обычно в стеке - для хранения данных в формате int. Когда вы говорите int *foo;, вы говорите компилятору выделить немного места в локальной области видимости для хранения указателя - для сохранения адреса - места в памяти, содержащего int.

Таким образом, NSArray *bar - это просто указатель на экземпляр и, да, NSArray bar;, если бы он не был явно запрещен, вырезал бы кусок пространства в стеке для хранения экземпляра NSArray.

Когда у вас есть указатель на что-то, что-то нужно каким-то образом инициализировать, и это часто делается посредством выделения (но не всегда).

person bbum    schedule 04.03.2010

Я считаю, что вы правы:

  1. да.

  2. Наверное. Я не уверен, что понимаю вопрос.

  3. Тип: как вы сказали, это не обязательно _1 _ + _ 2_, если вы используете определенные методы класса. Итак, выделение и инициализация выполняются неявно.

  4. Правильный. (см. выше)

  5. Я считаю, что это больше, чем просто числа, и что примитивы C не требуют управления памятью.

Я бы рекомендовал вам прочитать правила управления памятью от Apple, а также Стэнфордский курс по программированию на iPhone.

person Timothée Boucher    schedule 04.03.2010
comment
1 - неверно. 2 - Это c-ism. 3 - правильно. 4 - правильно. 5 - Вроде. - person bbum; 04.03.2010
comment
Спасибо за комментарий! Хорошее замечание по поводу №1. Дело не в том, что я не знаю, что вы не освобождаете явным образом каждый раз, а в том, что я ответил на вопрос, должны ли объекты быть освобождены (неявно мной или где-то еще)? (как в случае с автоматически выпущенными объектами). Но это был тупой способ читать вопрос :) - person Timothée Boucher; 04.03.2010