Вызовите метод экземпляра из метода класса - PullRequest
17 голосов
/ 23 января 2010

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

Пример:

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

-(void)foo {
//cool stuff
}

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

Ответы [ 3 ]

26 голосов
/ 23 января 2010

Нет способа сделать это. Он просто не работает с объектной ориентацией.

Классы виды вещей. Вот и все. Они просто описывают , что делает такая вещь.

В качестве примера можно привести класс «Собака». У вас были бы методы экземпляра, которые бы определяли, как собака виляет хвостом или как она ест. У вас может быть классный метод для покупки собаки.

Мой питомец, Фидо, является примером классной собаки. Я могу отправлять сообщения Фидо, говоря ему, чтобы вилять хвостом и есть его еду. Я не могу, однако, попросить класс «Собака» вилять хвостом; чей хвост будет вилять? Это будет Фидо или собака моего соседа?

Когда вы отправляете сообщение классу, у вас нет переменной «self» для работы. Нет ничего, что могло бы заставить себя вилять хвостом. Сообщения класса в основном используются для создания экземпляров класса или получения другой общей информации.

Редактировать: Чтобы уточнить, последний абзац является упрощенным. Как описывает bbum, в методах класса есть переменная «self» - это ссылка компьютера на описание класса. Тем не менее, я не думаю, что у меня когда-либо была возможность использовать «я» в методе класса.

16 голосов
/ 23 января 2010

Если вы хотите вызвать метод экземпляра, вам нужен экземпляр для вызова метода.

self - это ссылка на экземпляр, который обменивается сообщениями. Таким образом, self в методе класса является классом, а self в методе экземпляра является экземпляром класса.

Итак, наивно, вы можете сделать:

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

-(void)foo {
//cool stuff
}

Конечно, это приведет к утечке памяти в приложении, не относящемся к GC (поскольку экземпляр не освобождается и не выпускается автоматически). Вместо того, чтобы объяснять почему, я укажу вам на документацию Objective-C intro . Это удивительный материал, охватывающий как Objective-C, так и общие шаблоны объектно-ориентированного программирования.

0 голосов
/ 09 августа 2012
+ (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];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...