В Objective-C есть экземпляры, которые являются объектами, которые вы создаете и используете, и есть (полускрытые) объекты, которые являются объектами класса и которые создаются компилятором.Класс объект - это место, где хранятся методы класса;каждый экземпляр содержит только свои собственные данные (т. е. переменные экземпляра).
Bob * myBob = [[Bob alloc] init];
Здесь myBob
- это экземпляр.Каждый экземпляр имеет ссылку на свой объект класса. 1 Когда вы вызываете метод для экземпляра:
[myBob frogBlastTheVentCore];
среда выполнения идет и ищет метод в объекте класса, затемиспользует экземпляр и данные экземпляра для выполнения метода.Это базовая организация объектов в Obj-C: объекты экземпляров содержат данные и имеют ссылки на свои объекты классов, которые содержат методы.Существует только один объект класса на класс;все экземпляры этого класса имеют ссылку на один и тот же объект класса.
Класс (рассматриваемый как «тип», а не объект на мгновение 2 ) называется наследовать от другого класса:
@interface Bob : NSObject {
NSColor * uniformColor;
}
+ (BOOL) willShootAtPlayer;
- (void) frogBlastTheVentCore;
@end
@interface VacuBob : Bob {}
@end
Здесь VacuBob
является подклассом Bob
;любой экземпляр VacuBob
имеет свою собственную uniformColor
переменную экземпляра.Аналогично, существует объект класса VacuBob
, созданный компилятором;он также наследуется от Bob
- от Bob
объекта класса .Это означает, что объект класса VacuBob
также имеет метод willShootAtPlayer
.
В строке, которую вы разместили:
... aString = [NSString alloc] ...
объект класса на самом деле NSString
здесь.Вы вызываете метод класса с именем +[NSString alloc]
3 (методы класса обозначаются +
вместо -
4 ).Когда имя класса используется в качестве получателя сообщения (первая половина выражения в скобках), оно ссылается на объект класса 5 .В этом случае, тогда NSString
и aString
являются объектами;это просто два разных вида объектов;aString
это экземпляр.
Дейв Делонг (Dave DeLong) ссылается на хороший пост по этому вопросу (в частности, на диаграмме все в значительной степени изложено);для получения дополнительной информации вам также следует ознакомиться с описанием Мэтта Нойберга «Тайная жизнь классов» в его книге по iOS.Он описывает создание объектов класса, их использование и другие вещи, которые они делают, кроме хранения методов.
1 Это указатель isa
: ссылка myBob->isa
к Bob
объекту класса .
2 Переменная, ссылающаяся на объект класса, имеет тип Class
.Тип объекта экземпляра - это его класс.Таким образом, тип Bob
равен Class
, а тип myBob
равен Bob *
(то есть указатель на объект, тип которого Bob
).Различие между типом переменной и типом объекта может вызвать здесь некоторую путаницу.
3 Возвращаемое значение alloc
оказывается экземпляром NSString
, на котором вы вызываете метод экземпляра initWithString:
4 Методы класса параллельные методы экземпляра в том, что они вызываются с самим объектом класса в качестве аргумента.Поскольку объекты класса не имеют собственных данных, использование методов класса, возможно, более ограничено, чем другие языки ОО;методы класса чаще всего используются для торговых экземпляров.
5 Когда он используется в объявлении переменной: NSString * mySting;
, это имя типа переменной.