2013-02-05 2 views
2

Я знаю его очень простой вопрос. Получил некоторые проблемы с памятью, которые мне нужно уточнить. Вот мои сомнения:В чем разница между указателем C и указателем Objective C?

int *p = malloc (50); // will allocate 50 bytes and it is pointed by p. 

// Freeing C pointer--> 

free(p); 

Objective-C указатели:

ClassAobject *objA = .... // allocated ClassAobject.. 

// Freeing obj-C pointer---> 

objA = nil // Is it enough??? will it release all ivars memory properly.. 

что, если так, если у меня есть некоторые указатели C внутри предметного класса C? Как это делается в ARC

+1

Если вы используете ARC, вам не нужно выпускать какие-либо объекты – Ranjit

+0

Не нужно назначать нуль также ...? – Newbee

+0

Если вы этого не сделаете, вам нужно сохранить/удалить объекты, как и в C. Что вы используете? – ATaylor

ответ

9

Название не отражает то, что вы просите. Нет никакой разницы между указателями C и указателями Objective-C. На самом деле это просто простые указатели.

Что вы просите - это разница между их правильным использованием. Если указатель указывает на объект Objective-C, то при MRC, вы должны сделать

[obj release]; 

уменьшить его количество ссылок (которые потенциально могут освободить его). В ARC установить указатель на nil достаточно (как в вашем примере).

+0

Что делать, если дело, если у меня есть некоторые C-указатели внутри объектного класса C, я должен освободить его правильно? когда я должен это делать? – Newbee

+1

@Newbee В методе '- (void) dealloc' вашего класса. Кроме того, не забудьте называть '[super dealloc];' ** в конце. ** –

+0

Спасибо за ваш ответ .. Это понятно .. :) – Newbee

0

Нет никакой разницы между «C-указателями» и «указателями Objective-C». void * и int * точно совпадают с C и Objective-C.

Однако, когда вы используете ARC, некоторые типы указателей обрабатываются специально ARC. Эти типы указателей:

id 
Pointers to Objective-C objects like NSString* 
Class 
Blocks 

Это все указатели на различные виды объектов Objective-C, которые являются подсчет ссылок. ARC автоматически отслеживает, сколько ссылок на какой-либо из этих объектов существует, и если последняя ссылка удалена, сам объект освобождается.

Если объект освобожден, ARC автоматически удаляет все ссылки на объекты, на которые он ссылался. Однако, если у объекта есть указатели, которые не находятся под контролем ARC, вы должны делать все, что вам нужно сделать в dealloc.

Смежные вопросы