2012-04-24 3 views
2

Я изучаю Objective-C, и я смущен тем, что разница между экземпляром класса и объектом - они одинаковы?Является ли объект тем же, что и экземпляр класса?

Вот пример:

NSString *name = [[NSString alloc]initWithString:@"Harry"]; 

*name является указателем на NSString класса. @"Harry" - значение строки. Итак, name объект из класса NSString или name называется экземпляром класса?

Другой пример из класса, я сделал:

Rectangle *rect = [[Rectangle alloc]init]; 

Так *rect является указателем. Is rect a Объект или это экземпляр класса?

ответ

4

В ObjectiveC экземпляр класса всегда является объектом. И объект всегда является экземпляром класса. «Объект» - это экземпляр класса, класс, который где-то вниз по цепочке, в конце концов наследуется от NSObject. Когда вы объявляете класс без суперкласса, NSObject является неявным суперклассом.

NSString *name = [[NSString alloc] initWithString:@"Harry"]; 

name представляет собой указатель на объект, который более конкретно является экземпляром NSString, что имеет значение «Harry». Все объекты NSString являются объектами.

Rectangle *rect = [[Rectangle alloc] init]; 

То же самое здесь. rect - это указатель на объект, который является экземпляром Rectangle.

3

So *rect - указатель. Is rect a Объект или это экземпляр класса?

Это как. Экземпляр класса также является объектом, так как McIntosh, который я только что закончил, является экземпляром «класса» Apple, а также является плодом.

«Объект» - это общий термин для структуры программирования, который поддерживает некоторое состояние (его переменные экземпляра) и (как правило) может выполнять действия, которые влияют на это состояние (его методы). Экземпляр класса - это конкретный объект.

Объекты Objective-C доступны через указатели; это всего лишь механизм, с помощью которого вы взаимодействуете с ними. Строго говоря, сам объект и указатель на объект различны: rect - это указатель на объект, экземпляр класса Rectangle, но на обычном языке вы можете видеть, что люди говорят о них одинаково: rect - это Rectangle ,

+0

Это плохая аналогия. Вы объединяете oop и наследование с программированием jargon/terminology – ControlAltDel

+0

@ user1: Пожалуйста, уточните. «ООП», «наследование», «объект» и «экземпляр» - терминология программирования. –

+0

вы сделали комментарий, что ваше яблоко также является плодом. Это пример ООП. Затем вы говорите это как экземпляр, так и объект, что на самом деле просто объяснение, что в этой ситуации оба этих термина могут быть использованы. Итак, первый - ООП, второй - программирование jargon – ControlAltDel

2

Указатель не является объектом. Это просто адрес в памяти, где объект выделяется (хранится). Следовательно, он указывает на объект. Указатели на самом деле являются конструкцией на языке C, которую Objective-C наследует (pardon pun). Юлий прав, что вы услышите их взаимозаменяемо, технически «rect» - это экземпляр/объект, а «*» передает указатель.

+0

Спасибо за все ваши ответы, но я все еще немного смущен. Итак, мы говорим, что * rect - это просто указатель. rect - это объект (который является экземпляром из класса Rectangle). Память выделяется rect. – pete

+0

Это сложный тип. Локальная переменная 'rect' имеет тип' * Rectangle', то есть указатель на то, где в памяти хранятся данные экземпляра. Эти данные в памяти не имеют имени, его просто данных. Единственный способ получить это - указатель на него (на другом языке это может быть вызвано наличием «ссылки» на объект). В противном случае ваши данные будут просто битами, плавающими в чипе RAM. –

1

Спасибо за все ваши ответы, но я все еще немного смущен.Итак, мы говорим, что * rect - это просто указатель. rect - это объект (который является экземпляром из класса Rectangle). Память выделяется rect.

@pete да, у вас есть это правильно.