Подтвердить что ты не робот

Вызов метода экземпляра из метода класса

Поэтому мне нужно вызвать некоторые методы экземпляра из методов класса в objecitve-c...

Пример:

+(id)barWithFoo:(NSFoo *) {
[self foo]; //Raises compiler warning. 
}

-(void)foo {
//cool stuff
}

Итак, мой вопрос; StackOverFlow - это как вы делаете такие вещи в Objective-C, я новичок в ООП, так что я сошел с ума, или есть способ сделать это?

4b9b3361

Ответ 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];