что все переменные-указатели должны быть освобождены, когда они больше не используются?
Только если «переменная указателя» указывает на экземпляр класса 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.
Когда у вас есть указатель на что-то, что-то нужно как-то инициализировать, и это часто делается с помощью выделения (но не всегда).