Какие объекты я выделяю / освобождаю - PullRequest
0 голосов
/ 04 марта 2010

в Objective-C и, проще говоря, я прав, если предположить

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

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

Ответы [ 3 ]

3 голосов
/ 04 марта 2010

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

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

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

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

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

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

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

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

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

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

2 голосов
/ 04 марта 2010

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

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

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

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

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

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

NSString * foo = [NSString stringWithFormat: @ "Hello,% @", @ "World!"]; NSString * bar = @ "bar"; NSBundle * main = [NSBundle mainBundle];

(Кстати: ни один из вышеперечисленных не нуждается в -release.)

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

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

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

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

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

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

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

0 голосов
/ 04 марта 2010

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

  1. Да.

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

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

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

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

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

...