2015-01-31 2 views
-1

Я работаю свой путь через Objective C Programming (2-е издание) Большой Nerd ранчо и просто наткнулся на этот пример в главе 15 (Объекты и памяти):Указатель в Objective C против C

NSDate *currentTime = [NSDate date]; //currentTime points to date object at some address ("A") 
NSLog(@"currentTime's value is %p.\n", currentTime); 

sleep(2); 

currentTime = [NSDate date]; //currentTime now points to date object at different address ("B") 
NSLog(@"currentTime's value is now %p.\n", currentTime);[/code] 

Я хотел бы понять, почему currentTime изменилось с адреса A на адрес B, когда ему была назначена новая дата. Почему он не записывал данные для второй даты в ячейку памяти, используемую для 1-й даты (по адресу A)?

Это с кодом (редактирование: что ошеломляюще плохо, но я оставлю, как первоначально написана таким образом, комментарии/ответы имеют смысл):

int *i = 10; 
i = 12; 

не изменяет значение из & I или выделить любой дополнительная память, так что дает?

+5

'int * i = 10;' даже недействителен; если вы объявляете «i» в качестве указателя, то и «i = 12;» также недействителен. Указатели в Objective-C ведут себя точно так же **, как они ведут себя на C, поскольку указатели Objective-C ** - это просто простые указатели C. Кажется, что вы сбиваете с толку указатель с памятью, на которую указывает. Когда вы выполняете 'currentTime = [NSDate date];', то вы перенаправляете сам указатель на новый, недавно выделенный объект NSDate. «Почему он не записал данные для второй даты в ячейку памяти, используемую для 1-й даты» - просто потому, что вы не разыменовали указатель. –

+0

(то, о чем вы говорите, будет описываться чем-то вроде '* currentTime = * [NSDate date];', но это недопустимо, поскольку объекты Objective-C не могут быть переданы и скопированы по-значению, а только указатели на них разрешено. И все равно утечка памяти, выделенной для нового объекта.) –

+0

Спасибо. Мне действительно нужно начать тестирование «рабочего» кода, прежде чем я его опубликую здесь. Я слишком новичок в этом, чтобы не ошибаться. Новый вопрос: почему вы не пишете это как ответ, чтобы вы могли получить еще несколько отзывов? –

ответ

3

Почему не записывать данные на 2 даты в ячейку памяти, используемой для 1-го числа (в адрес A)?

Вы объявили currentTime как указатель на объект NSDate, как следует. Ответ на ваш вопрос кроется в том, что делает [NSDate date]. Он объявлен в NSDate.h как:

@interface NSDate (NSDateCreation) 
+ (instancetype)date; 
... 

Такого рода методы класса, отмеченные как возвращающая instancetype показывают, что метод концептуально фабричный метод. В этом случае это сокращение от [[NSDate alloc] init]. alloc выделяет память для нового объекта, а init инициализирует его.

Итак, когда вы присвоить новое значение в NSDate указатель, старый объект неявно освобожден (так как, по-видимому, вы используете ARC и вы объявили currentTime в качестве неявного сильной ссылки) и указатель обновляется, чтобы указать вновь созданный объект.

Это не должно отличаться от того, как ведут себя указатели C. Он аналогичен:

CDate *currentTime = malloc(sizeof(CDate)); 
CDate_Initialize(currentTime); 

sleep(2); 

free(currentTime); 
currentTime = malloc(sizeof(CDate)); 
CDate_Initialize(currentTime); 
... 
+0

Отлично - вы ответили на вопрос, на который я пытался ответить *, несмотря на то, что мой смущающий плохой пример. К большому примеру, я узнал еще больше об обработке памяти. Благодарю. –

0

[NSDate date]; определяет выделяет новый адрес, присваиваемое CURRENTTIME назначая его второй раз переписывает свое первое значение

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