Объекты класса и переменные экземпляра в Objective-C - PullRequest
4 голосов
/ 24 июня 2011

Мне трудно обдумать эту концепцию. Я возьму цитату именно из книги:

Объекты классов также наследуются от классов над ними в иерархии. Но поскольку у них нет переменных экземпляра (только экземпляры), они наследуют только методы.

Поправьте меня, если я ошибаюсь, но объект класса будет таким:

NSString *aString = [[NSString alloc]initWithString:@"abc.."];

Объект класса в этом случае - *aString - я сейчас прав?

Меня смущает второе предложение в приведенной выше цитате: «Но поскольку они не имеют переменных экземпляра (только экземпляры), они наследуют только методы».

Я думал, что объект (в данном случае *aString) является экземпляром класса NSString. Второе предложение выше подразумевает, что экземпляр - это нечто иное. Это не имеет никакого смысла для меня.

Ответы [ 3 ]

6 голосов
/ 24 июня 2011

Вы неверны.

NSString *aString = [[NSString alloc] initWithString:@"abc..."];

В этой строке слева направо мы имеем:

  • Тип: NSString *
  • Имя переменной: aString
  • присвоение
  • A Class: NSString
  • Вызов метода класса: +alloc
  • Вызов метода экземпляра для возвращаемого значения метода класса: -initWithString:
  • Объект, передаваемый в качестве параметра методу экземпляра: @"abc..."

В Objective-C Class на самом деле является своего рода объектом.Вы можете взаимодействовать с ними многими способами, аналогичными экземплярам, ​​но поскольку они являются «классами», они не могут иметь переменных экземпляра (поскольку переменные экземпляра по определению предназначены только для экземпляров).Classes есть только методы.Они наследуются от других Classes, и вот как реализовано наследование объектов.

Для получения дополнительной информации об этом, прочитайте этот замечательный пост в блоге Грега Паркера: http://www.sealiesoftware.com/blog/archive/2009/04/14/objc_explain_Classes_and_metaclasses.html

3 голосов
/ 24 июня 2011

В ObjectiveC сами классы являются объектами.

В вашем примере aString - это объект NSString, НО NSString также является объектом, это объект класса.

Объект класса имеет методы, объявленные следующим образом, например

@interface MyClass : NSObject
{
}

+(void) myClassMethod;

@end

Чтобы вызвать метод myClassMethod, введите:

[MyClass myClassMethod];

Но нет статической переменной, как в C ++ или Java, поэтому объект класса (здесь MyClass) не может содержать переменную, но экземпляр класса MyClass может иметь переменную.

Итак, чтобы возобновить NSString, это объект класса, а aString - это экземпляр объекта NSString.

1 голос
/ 25 июня 2011

В 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;, это имя типа переменной.

...