2012-01-12 51 views
0

考虑以下实施的几个类:三种不同类别的 .m文件执行anotherClass如何将一个子类设置为obj-c中超类的属性?

@implementation anotherClass 

@synthesize myObj; 

... 
//All of the code that uses the myObj property... 
... 

@end 

//superClass.h 
... 
@interface superClass 

//Insert useful code 

@end 

//subClass.h 
... 
@interface subClass : superClass 

//Insert useful code 

@end 

//Another class that uses various sub-classes of superClass 
@interface anotherClass 
{ 
    superClass* myObj; 
} 
@property (strong, atomic) superClass* myObj; 

@end 

.h文件中实现我怎样才能将subClass的实例设置为属性anotherClass.myObj的实例?

在我的具体情况下,我想定义一个属性是UIViewController。我有多个子类,UIViewControllers,我需要能够交换他们在我的iOS应用程序中的特定属性。

每次我尝试将我的孩子UIViewControllers中的一个设置为我的UIViewController属性时,该应用程序崩溃。但是,如果我将属性重新定义为其中一个子类的实例,然后实例化子类,则它完美地起作用。我真的需要有能力将这些控制器交换出来。我怎样才能做到这一点?

UPDATE

好,向大家致歉谁一直在寻找这一点。得到一个明显的答案后,我决定重新编写所有相关的代码。我创建了一个具有不同名称的新属性,将我的所有分配代码注释掉,并重新编写它以指向新的属性。它的工作方式应该如此。我不确定为什么这不是第一次,但它现在应该如此。但是,我仍然不清楚为什么我的应用程序崩溃。

+0

将子类分配给超类型变量是完全合法的,不会导致问题。它在UIKit中完成_constantly_。请发布有关崩溃的更多详细信息,以及您在分配前后如何处理对象。 – 2012-01-12 20:07:03

+0

谢谢Josh(和Caleb)我会将Caleb的回答标记为答案。我不确定发生了什么,因为我认为这会起作用,因为它不会让我迷路。我会更多地讨论代码,看看我能否制定一个不同的问题。 – RLH 2012-01-12 20:14:01

回答

1

只要做这项工作。 subClass的每个实例也是superClass的实例。这是subtype polymorphism的行动。

+0

但是,对于我在前几段中概述的情况,它不起作用。 – RLH 2012-01-12 20:07:37

+2

@RLH你至少可以告诉我们*为什么它会崩溃?当它崩溃时,你会得到什么错误信息?调试问题时会发生什么?什么方法导致崩溃?发布有问题的(实际)代码也不会有什么坏处。 – Caleb 2012-01-12 20:13:04

+0

这是代码:'myProperty = [[SubUIViewController alloc] initWithNibName:@“SubUIView”bundle:nil]; '。当我的应用程序点击该行时,它会发出以下错误:***由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [MasterClass setMyProperty:]:无法识别的选择器发送到实例0x399210'。 – RLH 2012-01-12 20:17:55