Вызов метода экземпляра из метода класса
Поэтому мне нужно вызвать некоторые методы экземпляра из методов класса в objecitve-c...
Пример:
+(id)barWithFoo:(NSFoo *) {
[self foo]; //Raises compiler warning.
}
-(void)foo {
//cool stuff
}
Итак, мой вопрос; StackOverFlow - это как вы делаете такие вещи в Objective-C, я новичок в ООП, так что я сошел с ума, или есть способ сделать это?
Ответы
Ответ 1
Нет способа сделать это. Он просто не работает с объектной ориентацией.
Классы - это виды вещей. Это. Они просто описывают, что это такое.
Примером может быть то, что у вас есть класс "Собака". У вас будут методы экземпляра, которые определяют, как собака виляет хвостом или как он ест. У вас может быть метод класса для покупки собаки.
Моя любимая собака Фидо - это экземпляр классной собаки. Я могу послать сообщения Фидо, говоря ему, чтобы он помахал хвостом и съел его еду. Однако я не могу попросить класс "Собака" помахать хвостом; чей хвост будет вилять? Будет ли это Фидо, или это будет моя соседка?
Когда вы отправляете сообщение классу, у вас нет переменной "self" для работы. Нет ничего, что могло бы сказать себе, чтобы помахать собственным хвостом. Сообщения класса в основном используются для создания экземпляров класса или получения другой общей информации.
Изменить: Чтобы уточнить, последний абзац является упрощенным. В методах класса есть переменная "self", как описывает bbum - это ссылка на компьютер для описания класса. Тем не менее, я не думаю, что когда-либо имел возможность использовать "я" в методе класса.
Ответ 2
Если вы хотите вызвать метод экземпляра, вам нужен экземпляр для вызова метода.
self
является ссылкой на экземпляр, который передается в сообщения. Таким образом, self
в методе класса является класс и self
в методе экземпляра является экземпляром класса.
Итак, наивно, вы можете сделать:
+(id)barWithFoo:(NSFoo *) {
[[[self alloc] init] foo]; //Raises compiler warning.
}
-(void)foo {
//cool stuff
}
Конечно, это утечка памяти в не-GC-приложении (поскольку экземпляр не выпускается или не автореализован). Вместо того, чтобы объяснять, почему, я укажу вам на Objective-C интро-документацию. Это несколько удивительных вещей, охватывающих как Objective-C, так и общие объектно-ориентированные шаблоны программирования.
Ответ 3
+ (MyClass *)getInstance
{
static MyClass *classInstance;
@synchronized(self)
{
if (!classInstance)
{
// This is never freed. Is a singleton a leak?
classInstance = [[[MyClass alloc] init] retain];
}
}
return classInstance;
}
[[MyClass getInstance] instanceMethod];