我谷歌这个问题并花一些时间自己弄明白,但运气不好。
我需要调用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文件中未定义的静态方法并提供正确的返回对象?
提前感谢, 罗斯特
答案 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]对象参数并返回和反对。