【问题标题】:How can I set a sub-class to a property that is a super-class in obj-c?如何将子类设置为 obj-c 中的超类属性?
【发布时间】:2012-02-09 02:56:36
【问题描述】:

考虑以下几个类的实现:

三个不同类的.h文件实现

//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

.m 文件实现anotherClass

@implementation anotherClass

@synthesize myObj;

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

@end

如何将subClass 的实例设置为属性anotherClass.myObj 的实例?

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

每次我尝试将我的一个子 UIViewControllers 设置为我的 UIViewController 属性时,应用程序都会崩溃。但是,如果我将属性重新定义为子类之一的实例,然后实例化一个子类,它就可以完美地工作。我真的需要能够将这些控制器换入和换出。我该怎么做?

更新

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

【问题讨论】:

  • 将子类分配给超类类型的变量是完全合法的,不会引起问题。它在 UIKit 中不断地完成。请发布有关崩溃的更多详细信息以及您在分配之前和之后对对象所做的其他操作。
  • 感谢 Josh(和 Caleb),我会将 Caleb 的回复标记为答案。我不确定发生了什么,因为我认为这会起作用,但因为它不会,我迷路了。我会更多地摆弄代码,看看我是否可以提出一个不同的问题。

标签: objective-c ios oop inheritance properties


【解决方案1】:

只做任务。 subClass 的每个实例也是superClass 的一个实例。那是subtype polymorphism 在行动。

【讨论】:

  • 正确,但是,在我在最后几段中概述的情况下,它不起作用。
  • @RLH 你能至少告诉我们为什么它会崩溃吗?当它崩溃时,您会收到什么错误消息?调试问题时会发生什么?什么方法导致崩溃?发布有问题的(真实)代码也没有什么坏处。
  • 这是代码:myProperty = [[SubUIViewController alloc] initWithNibName:@"SubUIView" bundle:nil]; 。当我的应用到达那条线时,它会抛出错误:*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[MasterClass setMyProperty:]: unrecognized selector sent to instance 0x399210'
  • 看起来你需要发布一些你的真实代码。 MasterClass 是否声明 setMyProperty?如果是这样,您是否记得在 SubUIViewController.m 中包含 MasterClass.h?
  • 我希望它必须更像foo.myProperty = ...,因为否则不会调用-setMyProperty:。那么,为什么 MasterClass 没有 myProperty 的设置器?
猜你喜欢
  • 2018-12-11
  • 1970-01-01
  • 2019-01-30
  • 2021-03-13
  • 1970-01-01
  • 2017-08-03
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
相关资源
最近更新 更多