在iOS中以编程方式实例化类

时间:2011-11-24 16:13:56

标签: objective-c ios xcode class design-patterns

我正在开发一个大型iOS项目,设计并不像我希望的那样好,但我必须坚持下去。 (生活有时可能是个婊子)。

问题是我们有一个基本上让你浏览目录的库。您有一个过滤器,您可以在其中指定某个搜索条件,并且您会看到一个列表,您可以按下您感兴趣的项目。当您按某个项目时,您可以看到更详细的描述。

该公司的工作是将同一软件销售给拥有不同目录的许多不同公司。我们的想法是,库具有所有主要功能,并且使用它的项目可能以某种方式扩展或完全覆盖某些给定的接口。

举个例子,假设我的库有2个类来管理2个视图。它们将是“FilterViewController”和“DetailsViewControllers”。在代码的某个地方,这个类被实例化。它看起来像这样

Class diagram schema

我的方法是这样的:

ProjectA方

// Here I configure the library
Library.FilterViewClass = ProjectAFilterViewController;
Library.DetailsViewClass = ProjectADetailViewController;

ProjectB方

Library.FilterViewClass = ProjectBFilterViewController;
Library.DetailsViewClass = nil;

图书馆方

// Did the user configure the library?
if(self.FilterViewClass == nil){
    // I alloc the default ViewController
    myFilterViewController = [[FilterViewController alloc] init]; 
}else{
    // Here I would like to alloc the custom ViewController
    myFilterViewController = [[Library.FilterViewClass alloc] init]; // DaProblem!
}

这种方法的问题是我实际上不知道是否可以以编程方式实例化对象。或者至少我不知道如何。也许我使用错误的方法,一些方向将不胜感激。提前Txs!

3 个答案:

答案 0 :(得分:14)

要从字符串中获取类,您可以使用此函数

Class cl = NSClassFromString(@"MyClass");

要获取现有变量的类,只需调用class方法。

Class cl = [obj class]; // assuming obj1 is MyClass

现在您可以创建MyClass

的实例
MyClass *myClass = (MyClass*)[[cl alloc] init];
...
[myClass release];

答案 1 :(得分:6)

使用

myFilterViewController = [[[Library.FilterViewClass class] alloc] init]; 

您也可以从类名实例化,这应该对您有用:

id obj = [[NSClassFromString(@"MyClass") alloc] init];

答案 2 :(得分:5)

Class someClass = [Foo1 class];
Foo * someObject = [[someClass alloc] init];
[someObject bar];

Class someClass2 = [Foo2 class];
Foo * someObject2 = [[someClass2 alloc] init];
[someObject2 bar];

接口+实现:

@interface Foo : NSObject 
- (void)bar;
@end

@interface Foo1 : Foo

@end

@interface Foo2 : Foo
@end

@implementation Foo
- (void)bar {
    NSLog(@"abstract foo");
}
@end

@implementation Foo1
- (void)bar {
    NSLog(@"foo1bar");
}
@end

@implementation Foo2
- (void)bar {
    NSLog(@"foo2bar");
}
@end

输出:

2011-11-24 11:24:31.117 temp[21378:fb03] foo1bar
2011-11-24 11:24:31.118 temp[21378:fb03] foo2bar