что все переменные указателя должны быть освобождены, когда они больше не используются?
Только если «переменная указатель» указывает на экземпляр класса Objective-C, и только если вы вызвали этот экземпляр будет сохранен ранее. Read this: Memory Management Guide.
Каждая переменная указатель ( **) класс какой-то, или нет? *
Если переменная указатель объявлен как указатель на экземпляр класса, то он укажет на экземпляр класса. В противном случае это не произойдет. Указатели именно это; указатель - ссылка - на кусок памяти. Этот кусок памяти может быть классом, экземпляром класса, структурой C или необработанным буфером (или чем-то еще).
Любая переменная указателя поэтому должна быть выделена и инициализирована с использованием «alloc» и «init» (или аналогичных)?
Только если указатель указывает на экземпляр класса Objective-C. Если это структура C, вы можете использовать malloc()
. Даже в случае объекта Objective-C вы можете не alloc
ничего:
NSString * foo = [NSString stringWithFormat: @ "Hello,% @", @ "World!"]; NSString * bar = @ "bar"; NSBundle * main = [NSBundle mainBundle];
(Кстати: Ни один из вышеперечисленных не нужен -release
.)
При объявлении variales с помощью методов объекта не может понадобиться "Alloc" или "INIT"?
Этот вопрос указывает на то, что вы должны идти читать - и перечитайте (я читал примерно один раз каждые 18 месяцев в течение первого десятилетия я написал код Objective-C, узнать что-то каждый раз) - the Objective-C language guide.
Возможно, вы также должны прочитать что-то о языке C. Это, вероятно, поможет вам понять указатели и другие типы.
Количество деклараций (BOOL, INT, поплавка и т.д.) не требуют управления памятью тех пор, пока они не объявлены как указатель?
Да, но это намного проще, чем конкретный тип. Когда вы говорите int foo;
, вы говорите компилятору, чтобы вырезать немного места в локальной области - в стеке, как правило, - для хранения ценности данных int. Когда вы говорите int *foo;
, вы сообщаете компилятору вырезать немного места в локальной области, чтобы сохранить указатель на - для хранения адреса - место в памяти, которое содержит int.
Таким образом, NSArray *bar
это просто указатель на экземпляр и, да, NSArray bar;
, если бы он не был явно запрещен, будет вырезать кусок пространства в стеке, чтобы держать экземпляр NSArray.
Если у вас есть указатель на что-то, что-то должно быть инициализировано каким-то образом, и это часто делается путем распределения (но не всегда).
1 - неверно. 2 - Это c-ism. 3 - правильно. 4 - правильно. 5 - Вид. – bbum
Спасибо за комментарий! Хорошая точка на # 1. Дело не в том, что я не знаю, что вы не публикуете явным образом каждый раз, это то, что я задал вопрос как «нужно ли освобождать объекты (неявно или мной или где-то еще)?» (как в случае с автореализованными объектами). Но это был глупый вопрос: –