Что означают знаки плюс и минус в Objective-C рядом с методом?

180

В Objective-C, я хотел бы знать , что +и -знаки рядом с средним определением метода.

- (void)loadPluginsAtPath:(NSString*)pluginPath errors:(NSArray **)errors;
gyurisc
источник

Ответы:

226

+для метода класса и -для метода экземпляра.

Например

// Not actually Apple's code.
@interface NSArray : NSObject {
}
+ (NSArray *)array;
- (id)objectAtIndex:(NSUInteger)index;
@end

// somewhere else:

id myArray = [NSArray array];         // see how the message is sent to NSArray?
id obj = [myArray objectAtIndex:4];   // here the message is sent to myArray

// Btw, in production code one uses "NSArray *myArray" instead of only "id".

Есть еще один вопрос, касающийся различий между методами класса и экземпляра .

Георг Шолли
источник
63
Как будто лишние пять символов «статика» для них слишком велики.
Анон.
23
@ Anon: методы не являются статичными. Это классовые методы. Они могут быть переопределены и являются частью иерархии классов. статика подразумевает что-то совсем другое в C.
bbum
4
@ Эйвон, это яблоко для тебя, они тоже пропустят вспышку на своей камере и правую кнопку на своих мышах. =)
pokstad
13
@bbum на деньги. Тот факт, что Java повторно присвоила ключевое слово «static» для обозначения чего-то иного, не является ошибкой гораздо более старого C. Хотя его использование может быть не совсем интуитивно понятным в C, в Java это кажется еще менее очевидным. Я ожидал бы, что static будет противоположностью динамического - то, что не меняется. И, конечно же, язык Objective-C существовал в течение почти 15 лет, прежде чем Apple применила его в OS X.
Куинн Тейлор,
3
Разница между статическим и классовым методом: определите метод + foo в MYBaseClass и его подклассе MYSubClass. NSArray * classes = @ [[MYBaseClass class], [MYSubClass class]]; [classes makeObjectsPerformSelector: @selector (foo)]; Не будет работать со статическим методом. Тем не менее, я would'a предпочтителен @classmethodи @methodили так, тоже. Почему так кратко ...?
Uliwitness
45

(+) для методов класса и (-) для метода экземпляра,

(+) Методы класса: -

Методы, которые объявлены как статические. Метод может быть вызван без создания экземпляра класса. Методы класса могут работать только с членами класса, а не с членами экземпляра, поскольку методы класса не знают членов экземпляра. Методы экземпляра класса также нельзя вызывать из метода класса, если они не вызываются для экземпляра этого класса.

(-) Методы экземпляра: -

С другой стороны, требуется, чтобы экземпляр класса существовал до их вызова, поэтому необходимо создать экземпляр класса с помощью ключевого слова new. Методы экземпляра работают с конкретными экземплярами классов. Методы экземпляра не объявляются как статические.

Как создать?

@interface CustomClass : NSObject

+ (void)classMethod;
- (void)instanceMethod;

@end

Как пользоваться?

[CustomClass classMethod];

CustomClass *classObject = [[CustomClass alloc] init];
[classObject instanceMethod];
Вандит Мехта
источник
18

+ методы - это методы класса, то есть методы, которые не имеют доступа к свойствам экземпляров. Используется для таких методов, как alloc или helper, для класса, которым не требуется доступ к переменным экземпляра

- методы являются методами экземпляра - относятся к одному экземпляру объекта. Обычно используется для большинства методов в классе.

Смотрите спецификацию языка для более подробной информации.

Роберт Кристи
источник
Ну, на самом деле методы класса имеют доступ к переменным экземпляра, просто у них нет экземпляра as self, а есть класс. Они просто не связаны с экземпляром, и поиск метода осуществляется не через экземпляр, а через класс. Тем не менее, вы могли бы сделать+exchangeIVarOf: (MYObject*)a with: (MYObject*)b { MYObject* x = a->ivar; a->ivar = b->ivar; b->ivar = x; }
uliwitness
5

Окончательное объяснение этого от Apple здесь, в разделе «Методы и обмен сообщениями»:

https://developer.apple.com/library/mac/referencelibrary/GettingStarted/RoadMapOSX/books/WriteObjective-CCode/WriteObjective-CCode/WriteObjective-CCode.html

Вкратце:

+ означает «метод класса»

(метод может быть вызван без создания экземпляра класса). Итак, вы называете это так:

[className classMethod]; 


- означает «метод экземпляра»

Сначала вам нужно создать экземпляр объекта, затем вы можете вызвать метод объекта). Вы можете вручную создать объект, подобный этому:

SomeClass* myInstance = [[SomeClass alloc] init];

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

Затем вызовите метод экземпляра:

[myInstance instanceMethod]

Альтернативный способ получить экземпляр объекта в Objective C выглядит следующим образом:

NSNumber *myNumber = [NSNumber numberWithInt:123];

который вызывает метод класса «numberWithInt» класса NSNumber, который является методом «фабрики» (т. е. методом, который предоставляет вам «готовый экземпляр» объекта).

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

NSString * myStringInstance = @ "abc";

Крис Хэлкроу
источник