2013-06-15 3 views
0

Я задаю этот вопрос и потрачу некоторое время, чтобы разобраться в этом сам, но с неудачей.Objective-C скрытый статический метод вызова

Мне нужно вызвать статический метод класса, который скрыт для пользователя класса.

// MyClass.h 
@interface MyClass : NSObject 

@end 

// MyClass.m 

@implementation MyClass 

- (NSString *)myInstanceMethod 
{ 
    return @"result string"; 
} 

+ (NSString *)myStaticMethod 
{ 
    return @"result string"; 
} 

@end 

------------------------------------------------------------ 

// MyCallerClass.m 
#import "MyClass.h" 

@implementation MyCallerClass 

- (void) testMethod 
{ 
    MyClass *inst = [MyClass new]; 
    // call 1 
    NSString *resultInstance = [inst performSelector:@selector(myInstanceMethod)]; 
    // call 2 
    NSString *resultStaitc  = [inst performSelector:@selector(myStaticMethod)]; 
    // call 
    [MyClass myStaticMethod]; 
} 

@end 

Звонок 1 работает хорошо, звонок 2 возвращает ноль, звонок 3 не компилируется.

Как я могу вызвать статический метод, который не определен в файле .h, и дать правильный возвращаемый объект?

Спасибо заранее, Rost

+1

Объектив-C не имеет ни статических, ни частных методов ... – bbum

ответ

2

Для вызова 2,

, так как это метод класса вы должны назвать как

NSString *resultStaitc  = [[inst class] performSelector:@selector(myStaticMethod)]; 

инст является object.To называть класс метод, который вы должны вызвать с классом. Класс экземпляра объекта должен вызывать метод, а не сам экземпляр.

Для вызова 3

Это должно работать нормально, значение результата никогда не используется .the компиляции ошибка, потому что

+ (NSString *)myStaticMethod; 

не объявлена ​​в .h использования

NSString *resultStaitc1 =[MyClass myStaticMethod]; 

и он вернет значение на resultStaitc1

+0

Да, это работает. Большое спасибо!! –

+0

>> Это не будет работать, поскольку объявлено приватным Да, вы правы, но я не хочу публиковать его. Я просто хочу проверить, как это работает из моих модульных тестов. –

+0

Оба будут работать. Приятно ехать, попробуйте оба –

1

Другой вариант - объявить неофициальный протокол для MyClass в верхней части MyCallerClass.m. Неформальный протокол - это просто интерфейс категории без блока реализации. Вы можете вставить свои объявления (ы) метода там. Это вызывает проблемы синхронизации между двумя исходными файлами, но также выполняет функциюSelector :. Выполнение этого способа позволяет вам вызывать методы, имеющие другую сигнатуру, чтобы просто принимать аргументы объекта [0-2] и возвращать объекты.

+0

Да, я считаю, что это сработает, но для моего случая (который я не описал в вопросе) он не подходит. Я пишу модульные тесты для кода, который я не могу изменить. Но в любом случае спасибо за внимание. –