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

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

- (void)loadPluginsAtPath:(NSString*)pluginPath errors:(NSArray **)errors;

person gyurisc    schedule 19.01.2010    source источник


Ответы (4)


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

E.g.

// 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".

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

person Georg Schölly    schedule 19.01.2010
comment
Кажется, что лишних пяти статических символов для них слишком много. - person Anon.; 20.01.2010
comment
Ссылка на документы: developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Conceptual/ - person Seth; 20.01.2010
comment
@Anon: методы не статичны. Это методы класса. Их можно переопределить, и они в значительной степени являются частью иерархии классов. static подразумевает что-то совсем другое в C. - person bbum; 20.01.2010
comment
@Avon, это яблоко для вас, они тоже не будут использовать вспышку на своих камерах и правую кнопку на мышах. знак равно - person pokstad; 20.01.2010
comment
@bbum на деньгах. Тот факт, что Java переназначил ключевое слово static для обозначения чего-то другого, не является ошибкой гораздо более старого C. Хотя его использование может быть не совсем интуитивно понятным в C, в Java это кажется еще меньше. Я ожидал, что статика будет противоположностью динамике - чем-то, что не меняется. И, конечно же, язык Objective-C существовал почти 15 лет, прежде чем Apple приняла его в OS X. - person Quinn Taylor; 05.05.2010
comment
Кажется, я не могу запомнить, что есть плюс, а что - минус. Есть ли какая-то логика в выборе символа? - person martinkunev; 03.04.2014
comment
@bbum Они статичны - речь идет об объектно-ориентированном программировании, а не о C. - person Luten; 14.08.2014
comment
@Luten, что вопрос помечен как цель-c, а OP конкретно спрашивает о цели-с, дает ответ, сфокусированный на цели-с. Кроме того, в oop есть разница между ними. - person bbum; 14.08.2014
comment
Разница между статическим методом и методом класса: определите метод + foo в MYBaseClass и его подклассе MYSubClass. NSArray * classes = @ [[MYBaseClass class], [MYSubClass class]]; [классы makeObjectsPerformSelector: @selector (foo)]; Не работает со статическим методом. Тем не менее, я бы тоже предпочел @classmethod и @method или около того. Почему так лаконично ...? - person uliwitness; 14.08.2014
comment
@uliwitness Краткость уходит корнями в прошлое, когда ObjC был реализован как препроцессор поверх компиляторов C. В то время использование разметки @... помимо введения интерфейсов и реализаций классов было довольно редким явлением. К тому времени, когда @... стал обычным явлением, + vs. - укоренился, и, я думаю, никогда не считалось целесообразным добавлять синонимичную синтаксическую форму для введения метода. - person bbum; 14.08.2014
comment
@Luten static - слишком переоцененное слово в программировании. :) - person bbum; 16.08.2014

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

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

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

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

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

Как создать?

@interface CustomClass : NSObject

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

@end

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

[CustomClass classMethod];

CustomClass *classObject = [[CustomClass alloc] init];
[classObject instanceMethod];
person Vandit Mehta    schedule 02.08.2013

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

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

Дополнительные сведения см. В Спецификации языка. .

person Robert Christie    schedule 19.01.2010
comment
Что ж, на самом деле методы класса имеют доступ к переменным экземпляра, у них просто не экземпляр как self, а скорее класс. Они просто не связаны с экземпляром, и поиск метода осуществляется не через экземпляр, а через класс. Тем не менее, вы могли бы +exchangeIVarOf: (MYObject*)a with: (MYObject*)b { MYObject* x = a->ivar; a->ivar = b->ivar; b->ivar = x; } - person uliwitness; 14.08.2014

Окончательное объяснение этого от 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";

person Chris Halcrow    schedule 15.10.2015