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