Відповіді:
+
призначений для класового методу та -
є методом екземпляра.
Напр
// 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
чи так, теж. Чому так лаконічно ...?
(+) для методів класу та (-) для прикладу,
(+) Класові методи: -
Є методи, які оголошені статичними. Метод можна викликати без створення екземпляра класу. Методи класу можуть діяти лише для членів класу, а не для членів екземпляра, оскільки методи класу не знають про членів екземпляра. Методи екземплярів класу також не можна викликати з методу класу, якщо вони не викликаються в екземплярі цього класу.
(-) Інстанційні методи: -
З іншого боку, потрібно, щоб екземпляр класу існував, перш ніж їх можна було викликати, тому екземпляр класу потрібно створити за допомогою нового ключового слова. Методи екземплярів діють на конкретних екземплярах класів. Методи екземплярів не оголошуються статичними.
Як створити?
@interface CustomClass : NSObject
+ (void)classMethod;
- (void)instanceMethod;
@end
Як використовувати?
[CustomClass classMethod];
CustomClass *classObject = [[CustomClass alloc] init];
[classObject instanceMethod];
+ методи - це методи класу - тобто методи, які не мають доступу до властивостей екземплярів. Використовується для таких методів, як аллок або хелперні методи для класу, які не потребують доступу до змінних примірників
- методи - це екземплярні методи - відносяться до одного екземпляра об'єкта. Зазвичай використовується для більшості методів на уроці.
Детальнішу інформацію див. У специфікації мови .
self
, а скоріше класу. Вони просто не пов'язані з екземпляром, і пошук методу відбувається не через екземпляр, а через клас. Тим не менше, ти міг би зробити+exchangeIVarOf: (MYObject*)a with: (MYObject*)b { MYObject* x = a->ivar; a->ivar = b->ivar; b->ivar = x; }
Остаточне пояснення цього від Apple знаходиться тут, у розділі "Методи та повідомлення":
Коротко:
(метод можна викликати без екземпляра екземпляра класу). Тож ви називаєте це так:
[className classMethod];
Спочатку потрібно інстанціювати об'єкт, потім можна викликати метод на об’єкті). Ви можете вручну інстанціювати такий об’єкт:
SomeClass* myInstance = [[SomeClass alloc] init];
(Це істотно виділяє пам'ять для об'єкта , то initalises об'єкта в цьому просторі -. Спрощення , але хороший спосіб думати про це Ви можете Alloc і форматувати об'єкт окремо , але ніколи не робити цього - це може привести до неприємних запитань , пов'язаних з покажчиками та управління пам'яттю)
Потім викличте метод примірника:
[myInstance instanceMethod]
Альтернативний спосіб отримати екземпляр об’єкта в Objective C такий:
NSNumber *myNumber = [NSNumber numberWithInt:123];
який викликає метод класу 'numberWithInt' класу NSNumber, який є «фабричним» методом (тобто методом, який надає вам «готовий екземпляр» об’єкта).
Завдання C також дозволяє створювати певні екземпляри об'єкта безпосередньо за допомогою спеціального синтаксису, як, наприклад, у випадку такого рядка:
NSString * myStringInstance = @ "abc";