Що означають знаки плюс і мінус у Objective-C поруч із методом?


180

У Objective-C я хотів би знати, що означають знаки +та -знаки поруч із визначенням методу.

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

Відповіді:


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: Методи не є статичними. Вони є класними методами. Вони можуть бути відмінені і є значною мірою частиною ієрархії класів. static має на увазі щось дуже різне в C.
bbum

4
@Avon, це яблуко для вас, вони також залишать спалах на їхній камері та праву кнопку на мишах. =)
покстад

13
@bbum стоїть на грошах. У тому, що Java перевласнила "статичне" ключове слово, щоб означати щось інше, не є виною набагато старшого С. Хоча його використання може бути не зовсім інтуїтивно зрозумілим у С, це здається ще менше. Я б очікував, що статичність буде протилежною динаміці - те, що не змінюється. І звичайно, мова Objective-C існувала майже 15 років, перш ніж Apple прийняла її в ОС X.
Квінн Тейлор

3
Різниця між статичним і класовим методом: Визначте метод + foo в MYBaseClass та його підкласі MYSubClass. NSArray * класів = @ [[клас MYBaseClass], [клас MYSubClass]]; [класи makeObjectsPerformSelector: @selector (foo)]; Не працюватиме статичним методом. Тим НЕ менше, я would'a кращий @classmethodі @methodчи так, теж. Чому так лаконічно ...?
uliwitness

45

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

(+) Класові методи: -

Є методи, які оголошені статичними. Метод можна викликати без створення екземпляра класу. Методи класу можуть діяти лише для членів класу, а не для членів екземпляра, оскільки методи класу не знають про членів екземпляра. Методи екземплярів класу також не можна викликати з методу класу, якщо вони не викликаються в екземплярі цього класу.

(-) Інстанційні методи: -

З іншого боку, потрібно, щоб екземпляр класу існував, перш ніж їх можна було викликати, тому екземпляр класу потрібно створити за допомогою нового ключового слова. Методи екземплярів діють на конкретних екземплярах класів. Методи екземплярів не оголошуються статичними.

Як створити?

@interface CustomClass : NSObject

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

@end

Як використовувати?

[CustomClass classMethod];

CustomClass *classObject = [[CustomClass alloc] init];
[classObject instanceMethod];

18

+ методи - це методи класу - тобто методи, які не мають доступу до властивостей екземплярів. Використовується для таких методів, як аллок або хелперні методи для класу, які не потребують доступу до змінних примірників

- методи - це екземплярні методи - відносяться до одного екземпляра об'єкта. Зазвичай використовується для більшості методів на уроці.

Детальнішу інформацію див. У специфікації мови .


Ну, насправді методи класів мають доступ до змінних екземплярів, вони просто не мають екземпляра як 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];

(Це істотно виділяє пам'ять для об'єкта , то initalises об'єкта в цьому просторі -. Спрощення , але хороший спосіб думати про це Ви можете Alloc і форматувати об'єкт окремо , але ніколи не робити цього - це може привести до неприємних запитань , пов'язаних з покажчиками та управління пам'яттю)

Потім викличте метод примірника:

[myInstance instanceMethod]

Альтернативний спосіб отримати екземпляр об’єкта в Objective C такий:

NSNumber *myNumber = [NSNumber numberWithInt:123];

який викликає метод класу 'numberWithInt' класу NSNumber, який є «фабричним» методом (тобто методом, який надає вам «готовий екземпляр» об’єкта).

Завдання C також дозволяє створювати певні екземпляри об'єкта безпосередньо за допомогою спеціального синтаксису, як, наприклад, у випадку такого рядка:

NSString * myStringInstance = @ "abc";

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.