Objective-C隐藏静态方法调用

时间:2013-06-15 08:37:01

标签: objective-c objective-c-runtime

我谷歌这个问题并花一些时间自己弄明白,但运气不好。

我需要调用class的静态方法,该方法对于类的用户是隐藏的。

// 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

Call 1工作正常,Call 2返回nil,Call 3不编译。

如何调用.h文件中未定义的静态方法并提供正确的返回对象?

提前感谢, 罗斯特

2 个答案:

答案 0 :(得分:2)

对于Call 2,

因为它是类方法,所以你应该像

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

inst是对象。要调用类方法,必须使用类调用。 对象实例的类应该调用方法,而不是实例本身。

致电3

它应该工作正常,结果值永远不会使用。编译错误是因为

+ (NSString *)myStaticMethod;

未在.h

中声明

使用

NSString *resultStaitc1   =[MyClass myStaticMethod];

并将值返回resultStaitc1

答案 1 :(得分:1)

另一种选择是在MyCallerClass.m的顶部为MyClass声明一个非正式协议。非正式协议只是一个没有实现块的类别接口。你可以在那里坚持方法声明。它确实引发了两个源文件之间的同步问题,但performSelector:也是如此。这样做可以让你调用具有不同签名的方法来获取[0-2]对象参数并返回和反对。