如何调用我使用NSClassFromString动态创建的类中的方法?

Eth*_*len 3 iphone xcode cocoa dynamic objective-c

我正在进行动态类加载的原因是因为我创建了一组可以在多个类似项目中使用的文件,因此执行#import然后正常实例化将无法正常工作.动态类允许我这样做,只要我可以在这些类中调用方法.每个项目在pch中都有一个不同的"kMediaClassName"名称,所以我可以根据我所在的项目动态加载不同的类:

#define kMediaClassName @"Movie"
Run Code Online (Sandbox Code Playgroud)

这是我用来动态获取类实例的代码:

Class mediaClass = NSClassFromString(kMediaClassName);
id mediaObject = [[[mediaClass alloc] init] autorelease];
Run Code Online (Sandbox Code Playgroud)

然后我尝试在该动态类中调用一个方法:

[mediaObject doSomething];
Run Code Online (Sandbox Code Playgroud)

当我将其键入Xcode时,编译器会显示一个警告,即该类没有此方法,即使它有.我可以在我的Movie.h文件中看到它.到底是怎么回事?如何从动态实例化的类中调用方法?

如果我需要传递多个参数怎么办?

[mediaObject loadMedia:oneObject moveThe:YES moveA:NO];
Run Code Online (Sandbox Code Playgroud)

我在这里先向您的帮助表示感谢.

jus*_*tin 8

你可以声明一个协议,如下所示:

@protocol MONMediaProtocol

/*
  remember: when synthesizing the class, you may want
  to add the protocol to the synthesized class for your sanity
*/

- (BOOL)downloadMediaAtURL:(NSURL *)url toPath:(NSString *)path loadIfSuccessful:(BOOL)loadIfSuccessful;

/* ...the interface continues... */

@end
Run Code Online (Sandbox Code Playgroud)

正在使用:

Class mediaClass = NSClassFromString(kMediaClassName);
assert(mediaClass);

id<MONMediaProtocol> mediaObject = [[[mediaClass alloc] init] autorelease];
assert(mediaObject);

NSURL * url = /* expr */;
NSString * path = /* expr */;

BOOL loadIfSuccessful = YES;

BOOL success = [mediaObject downloadMediaAtURL:url toPath:path loadIfSuccessful:loadIfSuccessful];
Run Code Online (Sandbox Code Playgroud)