2014-02-21 9 views
2

В моем коде я хочу знать, является ли метод методом класса или методом экземпляра. Код, который я в настоящее время использую, работает, но мне интересно, есть ли счетчик.Является метод метод класса или метод экземпляра

Текущий код «обнаружить», если это метод класса или экземпляра:

Method method = class_getInstanceMethod(class, selector); 
if (method) { 
    __strong Class object = [[class alloc] init]; 
    objc_msgSend(object, selector); 
}else { 
    method = class_getClassMethod(class, selector); 
    if (method) { 
    objc_msgSend(class, selector); 
    } 
} 
+0

Я уверен, что ваш код не может быть улучшен. Вы можете изменить 'objc_msgSend' на' performSelector: ', если вы действительно этого хотите, но нет никакого смысла делать это. – Avt

+2

Мне очень любопытно, что вы здесь. Каждая подпись в объекте = c указывает, является ли это методом класса или экземпляра, поэтому мне интересно, зачем вам это нужно во время выполнения. –

+0

@NuclearGhost. Я хочу вызвать метод на объекте, которого может не быть. Это может быть метод экземпляра или метод класса. Уоррен Бертон, почему инвертировать, поскольку он будет создавать только экземпляр, если это метод класса. Этот объектный файл не может быть импортирован. И это общая функция для этого. Я мог бы сделать две функции, например, для класса другого. – Haagenti

ответ

3

Там очень мало, что вы можете улучшить за два if заявления. Вы можете использовать respondsToSelector: метод вместо, но так как у вас нет объекта, чтобы начать с, вы будете в конечном итоге с if помещенную в if, а не лучше выглядящий else if:

if ([class respondsToSelector:selector]) { 
    // Call class method 
} else { 
    id object = [[class alloc] init]; 
    if ([object respondsToSelector:selector]) { 
     // Call instance method 
    } 
} 

Если бы вы могли изменить ваш программный поток, начинающийся с объекта, а не класса, вы делаете это вместо этого:

if ([object respondsToSelector:selector]) { 
    // Call instance method 
} else if ([[object class] respondsToSelector:selector]) { 
    // Call class method 
} 
+0

Метод не имеет ответаToSelector – Haagenti

+0

@MouNtant метод - это селектор, объект имеет селектор. Это гораздо более простой код, чем ваш, опубликованный в вопросе, который является излишним. –

+0

@MouNtant Я не понял, что у вас нет «объекта» в начале. Я отредактировал ответ, чтобы начать с метода класса так же, как и вы. – dasblinkenlight

Смежные вопросы