В Objective-C, когда я должен использовать методы класса и когда я должен использовать методы экземпляра?

В чем разница между методами класса и экземпляра в Objective-C и когда мне следует использовать каждый из них?

10 голосов | спросил Tirth 30 J0000006Europe/Moscow 2010, 09:32:40

5 ответов


0

Используя аналогию с усталым старым автомобилем ...

Думайте о классе, как о фабрике, которая создает экземпляры класса. Например, у вас может быть класс Car, и вы можете объявить метод вроде:

+ carWithColor: (NSColor *) aColor;

И этот метод затем создаст новый экземпляр Car, установит цвет и вернет его:

 + carWithColor: (NSColor *) aColor
 {
     Car *aCar = [[[self alloc] init] autorelease];
     [aCar paintWithColor: aColor];
     return aCar;
 }

Теперь этот класс Car объявит метод экземпляра, который позволяет покрасить автомобиль. Почему метод экземпляра? Потому что у каждого автомобиля может быть свой цвет (и цвет автомобиля, скорее всего, будет сохранен в переменной экземпляра).

- (void) paintWithColor: (NSColor *) aColor
{
    ... do your paint stuff here ...
}

Это объясняется в объектах, классах и раздел обмена сообщениями документации Objective-C.

ответил bbum 30 J0000006Europe/Moscow 2010, 10:00:39
0

Это старый пост, но так как он появляется первым в поиске в Google, я решил добавить к нему.

Я не буду говорить о методах класса, используемых в качестве фабричных методов. Я хотел бы поговорить об их использовании в служебных методах. Вы можете /должны использовать методы класса для служебных методов, которые не зависят от состояния. Что это значит? Ну, например, если вы форматируете дату одинаково для всех экземпляров, это служебный метод, который должен быть методом класса. Думайте о служебном методе как об отвертке. Вам не нужно создавать новый экземпляр отвертки каждый раз, когда вы хотите что-то с ним сделать. Отвертка остается постоянной. Так, например, у меня есть класс, который включает частный метод, который генерирует строку emDashes, используемую для отображения в представлении. Этот метод не зависит от состояния и, следовательно, не зависит от конкретного случая. Думайте о методах утилит класса как о константах.

+ (NSString *)emDashString {
return @"   \u2014 \u2014 \u2014 \u2014 \u2014 \u2014 \u2014 \u2014 \u2014";

}

Вы можете вызывать этот метод в рамках класса (в моем примере это приватно) следующим образом:

NSString *string = [[self class] emDashString ];

Я намеренно выбрал несколько тривиальных примеров, чтобы понять суть дела. Вы бы потрудились сделать этот метод утилитой класса только в том случае, если вам понадобится эта строка более одного раза в вашем классе. Обратите внимание, что вместо ссылки на класс по имени я называю его в общем случае с помощью [self class], поскольку он вызывается внутри. Если он открыт, и вы хотите вызвать его из другого класса, тогда, как обычно, обращайтесь к нему по имени класса.

ответил smileBot 16 Jpm1000000pmThu, 16 Jan 2014 19:58:00 +040014 2014, 19:58:00
0
Методы

экземпляра работают с экземплярами класса:

NSString *myString;
myString = [[[NSString alloc] initWithString:@"Hello, world."] autorelease];
NSLog (@"myString's length: %u", [myString length]); // instance method
Методы

класса могут выполнять специфичные для класса вещи, не полагаясь на экземпляр объекта, часто возвращая экземпляр класса или какой-либо другой результат, специфичный для класса:

NSLog (@"%@", [NSString stringWithString:@"Hello, world."]); // class method

Я думаю, что редко можно увидеть методы класса, которые ничего не возвращают.

ответил Alex Reynolds 30 J0000006Europe/Moscow 2010, 10:09:31
0

Вам не нужно реализовывать оба. Любой из вариантов доступен для вас при разработке класса.

Метод экземпляра может работать с экземпляром класса. Это может получить или установить свойство или вызвать поведение, которое вы хотите, чтобы только этот экземпляр выполнял. Вам действительно нужно иметь экземпляр, чтобы использовать его. Они могут использовать или изменять состояние экземпляра.

// Notional instance methods
myHouse.color = blueColor;

[myCar accelerate];
speed = myCar.speed;

Метод класса оперирует понятием, что класс существует. Его можно использовать для создания экземпляра или выполнения вычисления, которое не зависит от наличия экземпляра. У вас может быть класс для пользовательского помощника по математике, который по существу содержит функции.

// Notional class method uses
myString = [NSString stringWithFormat:@"&f", floatToConvert];

myResult = [MyMathHelper MyFunctionWithInput:myInput];
ответил mbmcavoy 30 J0000006Europe/Moscow 2010, 10:14:49
0

Сигнатуры методов класса имеют префикс +, а методы экземпляров - - поэтому объявления в заголовочном файле будут выглядеть примерно так:

-(void)setAllThings:(NSArray*)things; //instance method
+(void)setAllClassThings:(NSArray*)things; //class method

И, конечно, те же правила применяются при определении методов в файле .m.

ответил anq 30 J0000006Europe/Moscow 2010, 09:42:05

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132