2010-03-04 1 views
0

в Objective-C и просто говоря - я правильно при предположенииКакие объекты я Alloc/релиз

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

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

ответ

0

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

  1. Да.

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

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

  4. Исправить. (см. выше)

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

Я рекомендую вам прочитать memory management rules from Apple, а также Stanford class on iPhone Programming.

+0

1 - неверно. 2 - Это c-ism. 3 - правильно. 4 - правильно. 5 - Вид. – bbum

+0

Спасибо за комментарий! Хорошая точка на # 1. Дело не в том, что я не знаю, что вы не публикуете явным образом каждый раз, это то, что я задал вопрос как «нужно ли освобождать объекты (неявно или мной или где-то еще)?» (как в случае с автореализованными объектами). Но это был глупый вопрос: –

2

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

Только если «переменная указатель» указывает на экземпляр класса 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.

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

3

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

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

2) Любая переменная указателя (*) является классом или нет?

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

3) Каждая переменная указателя, следовательно, должен быть выделены и инициализируется с помощью "Alloc" и "INIT" (или аналогичный)?

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

4) При объявлении variales с помощью объекта методы не могут потребоваться "Alloc" или "INIT"?

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

5) Количество деклараций (BOOL, INT, поплавок, и т.д.) не требуют управления памятью тех пор, пока они не объявлены как указатель?

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