В Objective-C я хотел бы знать, что означают знаки +
и -
рядом с определением метода.
- (void)loadPluginsAtPath:(NSString*)pluginPath errors:(NSArray **)errors;
В Objective-C я хотел бы знать, что означают знаки +
и -
рядом с определением метода.
- (void)loadPluginsAtPath:(NSString*)pluginPath errors:(NSArray **)errors;
+
- для метода класса, а -
- для метода экземпляра.
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".
Есть еще один вопрос, касающийся разницы между методами класса и экземпляра.
@classmethod
и @method
или около того. Почему так лаконично ...?
- person uliwitness; 14.08.2014
@...
помимо введения интерфейсов и реализаций классов было довольно редким явлением. К тому времени, когда @...
стал обычным явлением, +
vs. -
укоренился, и, я думаю, никогда не считалось целесообразным добавлять синонимичную синтаксическую форму для введения метода.
- person bbum; 14.08.2014
static
- слишком переоцененное слово в программировании. :)
- person bbum; 16.08.2014
(+) для методов класса и (-) для метода экземпляра,
(+) Методы класса: -
Методы, объявленные как статические. Метод можно вызвать без создания экземпляра класса. Методы класса могут работать только с членами класса, а не с членами экземпляра, поскольку методы класса не знают членов экземпляра. Методы экземпляра класса также нельзя вызывать из метода класса, если они не вызываются в экземпляре этого класса.
(-) Методы экземпляра: -
С другой стороны, требуется, чтобы экземпляр класса существовал до того, как их можно будет вызвать, поэтому необходимо создать экземпляр класса с использованием ключевого слова new. Методы экземпляра работают с конкретными экземплярами классов. Методы экземпляра не объявляются статическими.
Как создать?
@interface CustomClass : NSObject
+ (void)classMethod;
- (void)instanceMethod;
@end
Как использовать?
[CustomClass classMethod];
CustomClass *classObject = [[CustomClass alloc] init];
[classObject instanceMethod];
+ методы - это методы класса, то есть методы, не имеющие доступа к свойствам экземпляров. Используется для таких методов, как alloc или вспомогательные методы для класса, которым не требуется доступ к переменным экземпляра
- методы - это методы экземпляра - относятся к одному экземпляру объекта. Обычно используется для большинства методов класса.
Дополнительные сведения см. В Спецификации языка. .
self
, а скорее класс. Они просто не связаны с экземпляром, и поиск метода осуществляется не через экземпляр, а через класс. Тем не менее, вы могли бы +exchangeIVarOf: (MYObject*)a with: (MYObject*)b { MYObject* x = a->ivar; a->ivar = b->ivar; b->ivar = x; }
- person uliwitness; 14.08.2014
Окончательное объяснение этого от Apple находится здесь, в разделе «Методы и обмен сообщениями»:
Вкратце:
(метод может быть вызван без экземпляра создаваемого класса). Вы называете это так:
[className classMethod];
Сначала вам нужно создать экземпляр объекта, а затем вы можете вызвать метод объекта). Вы можете вручную создать экземпляр объекта следующим образом:
SomeClass* myInstance = [[SomeClass alloc] init];
(это, по сути, выделяет пространство памяти для объекта, а затем инициализирует объект в этом пространстве - чрезмерное упрощение, но хороший способ подумать об этом. Вы можете выделить и инициализировать объект по отдельности, но никогда не делайте этого - это может привести к неприятным проблемам, связанным с указателями и управлением памятью)
Затем вызовите метод экземпляра:
[myInstance instanceMethod]
Альтернативный способ получить экземпляр объекта в Objective C выглядит следующим образом:
NSNumber *myNumber = [NSNumber numberWithInt:123];
который вызывает «numberWithInt» метод класса класса NSNumber, который является «фабричным» методом (то есть методом, который предоставляет вам «готовый экземпляр» объекта).
Objective C также позволяет создавать определенные экземпляры объектов напрямую, используя специальный синтаксис, как в случае со строкой, подобной этой:
NSString * myStringInstance = @ "abc";