转发所选类以在另一个类中使用

时间:2015-01-20 12:11:07

标签: ios objective-c class-method

我有一点脑屁。我希望有人可以帮助我。

我有一个与不同设备通信的应用。根据它与之通信的设备,我需要使用不同的方法。

我有几个不同的类进行一些解析,我已经创建了一个名为Parse的类的子类(不要与Parse云服务混淆),这些只有Class方法。例如Parse_Device1 Parse_Device2

我有第三个类(让我们称之为Selection),它会返回各种不同的东西,具体取决于应用与之通信的设备。

如何让这个类返回所需的Parse子类并使用返回的内容?

我知道我可以轻松allocinit所需的课程,存储或归还。 但是,由于解析类上的所有方法都只是Class方法,因此根本不需要init

我尝试过这样,但我似乎无法直接使用返回的类:

+ (Parser *)parser_AccessList
{
    switch ([self brand]) {
        case Brand1:
            return [Parse_AccessList_1 alloc];
            break;

        case Brand2:
            return [Parse_AccessList_2 alloc];
            break;

        case Brand3:
            return [Parse_AccessList_3 alloc];
            break;

        default:
            return nil;
            break;
    }
}

我可能在这里遗漏了一些非常简单的东西。

由于

3 个答案:

答案 0 :(得分:1)

返回类对象。然后,调用者可以对该类的对象进行实例化或对其调用类方法(通过发送类方法选择器)。

return [Parse_AccessList_1 class];

我们假设这是在调用者的某个地方:

Class clazz = yourObject parser_AccessList];
[clazz performSelector:@selector(someMethod)];

由于clazzClass类型的对象,因此可以调用相关的类方法someMethod

但是,我相信有更好的方法可以达到目标。尝试使用委托模式和/或依赖项反转。

答案 1 :(得分:1)

此方法(消息):

parser_AccessList

回归:

(Parser *)

这意味着它将始终返回分配的类类型,因此如果要返回“any”类,则应该像这样定义方法:

+ (id)parser_AccessList

这个问题是你不知道你应该期望哪个类,所以你可能会在初始化之后验证它。

另外,您确定不需要初始化这些解析器吗?

...
return [[Parse_AccessList_1 alloc] init];
...

答案 2 :(得分:0)

在类方法中,“self”是类本身。分配实例时([Parse_AccessList_1 alloc]),您必须初始化!

编辑:

#import <objc/runtime.h>

...

Class cl = NSClassFromString(@"TestClass");
return [[cl alloc] init];