我如何在使用NSClassFromString动态创建的类中调用方法? [英] How do I call methods in a class that I created dynamically with NSClassFromString?

查看:145
本文介绍了我如何在使用NSClassFromString动态创建的类中调用方法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

  #define kMediaClassName @Movie

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

 类mediaClass = NSClassFromString(kMediaClassName); 
id mediaObject = [[[mediaClass alloc] init] autorelease];

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

  [mediaObject doSomething]; 

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



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

  [mediaObject loadMedia:oneObject moveThe:YES moveA:NO]; 

提前感谢您的帮助。

解决方案

您可以声明协议,如下所示:



<$ p $记住:当合成课程时,您可能希望
将协议添加到合成类中以保持理智。
* /

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

/ * ...界面继续... * /

@end

正在使用:

 类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];


The reason I am doing dynamic class loading is because I am creating a single set of files that can be used across multiple similar projects, so doing a #import and then normal instantiation just won't work. Dynamic classes allows me to do this, as long as I can call methods within those classes. Each project has this in the pch with a different "kMediaClassName" name so I can dynamically load different classes based on the project I'm in:

#define kMediaClassName @"Movie"

Here is the code I am using to get an instance of a class dynamically:

Class mediaClass = NSClassFromString(kMediaClassName);
id mediaObject = [[[mediaClass alloc] init] autorelease];

Then I try to call a method within that dynamic class:

[mediaObject doSomething];

When I then type this into Xcode, the compiler shows a warning that the class doesn't have this method, even though it does. I can see it right there in my Movie.h file. What is going on? How do I call a method from a dynamically instantiated class?

And what if I need to pass multiple arguments?

[mediaObject loadMedia:oneObject moveThe:YES moveA:NO];

Thanks for the help in advance.

解决方案

you can declare a protocol, like so:

@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

in use:

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];

这篇关于我如何在使用NSClassFromString动态创建的类中调用方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆