2010-01-23 3 views
17

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

Пример:

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

-(void)foo { 
//cool stuff 
} 

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

+0

Эта нить ответил мне: http://stackoverflow.com/questions/1053592/objective-c-class-vs-instance-methods – jsherk

+1

Нет, это не отвечает на вопрос MÕÕT в. Moot хочет знать, можно ли вызвать метод экземпляра внутри метода класса. Нет, мы не можем! Но вы можете использовать 'NSNotificationCenter', добавить наблюдателя с селектором в свой метод экземпляра и' postNotification' изнутри вашего метода класса –

ответ

14

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

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

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

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

-(void)foo { 
//cool stuff 
} 

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

+0

Это хорошее обходное решение Спасибо !, хотя я должен признать, что это идет против объекта - ориентации. – Moot

+3

Нет, это не так. Общий шаблон - создать экземпляр какого-либо объекта, а затем передать его '-startDoingSomethingUsefulAutomatically'. После запуска объект может быть оставлен на своих устройствах для остальной части сеанса приложения. – bbum

+2

Это также не обходное решение.Вы спросили, как вызвать метод экземпляра из метода класса. Для этого требуется экземпляр. Конец истории. – bbum

25

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

Занятия Виды вещей. Вот и все. Они просто описывают что это делает.

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

Моя любимая собака Fido - это экземпляр класса собаки. Я могу послать сообщения Фидо, говоря ему, чтобы он помахал хвостом и съел его еду. Однако я не могу попросить класс «Собака» помахать хвостом; чей хвост будет вилять? Будет ли это Фидо, или это будет собака моего соседа?

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

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

+0

Это довольно показательно! Спасибо! – Moot

0
+ (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]; 
Смежные вопросы