0

我用谷歌搜索了这个问题,并花了一些时间自己弄清楚,但运气不好。

我需要调用对类的用户隐藏的类的静态方法。

// 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 返回 nil,调用 3 无法编译。

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

提前致谢, 罗斯特

4

2 回答 2

2

对于呼叫 2,

因为它是一个类方法,你应该像这样调用

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

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

呼叫 3

它应该工作正常,结果值从未使用过。编译错误是因为

+ (NSString *)myStaticMethod;

未在 .h 中声明

利用

NSString *resultStaitc1   =[MyClass myStaticMethod];

它会将值返回给resultStaitc1

于 2013-06-15T08:54:12.137 回答
1

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

于 2013-06-15T09:29:25.057 回答