【问题标题】:Pointer to parent class - prevent warning message指向父类的指针 - 防止警告消息
【发布时间】:2012-10-27 00:50:22
【问题描述】:

我有一个由父类的实例创建的类实例。当子类被创建时,它被赋予一个指向父类的指针,这样我就可以从子类在父类上启动一个实例方法(myMethod)。

我的父类是一个 UIViewController,叫做 myViewController。但是,XCode 给了我一个警告,说“UIViewController 可能无法响应 myMethod”。

导致错误的行(在子类中)如下所示:

[self.parent myMethod];

虽然这可以通过并且工作正常,但我想阻止警告消息。我可以做些什么来向 XCode 保证没有问题,并且“self.parent”(这是一个 UIViewController)会响应“myMethod”吗?

【问题讨论】:

  • 类不创建类。您有一个由不同类的 instance 创建的类的 instance。区别很重要。
  • 谢谢。问题相应调整。

标签: objective-c pointers methods


【解决方案1】:

你可以对它进行类型转换:

myViewController * p = (myViewController*)self.parent;
assert([p isKindOfClass:[myViewController class]]);
[p myMethod];

…虽然设计往往是一种气味。

【讨论】:

  • 当您可以将指针声明为正确的类型时,无需这样做。
  • @HotLicks 好点+1,尽管在parent 并不总是myViewController 的情况下这样做并不明智(这是我的假设)。
  • 如果所有的作业都输入正确,那么parent 是错误的类型应该不会比“正常”更危险。不需要演员表。
  • @HotLicks OP 中没有足够的上下文来确定要为 ivar 声明的正确类型。如果实例类型不同,因此UIViewController 是公共基础,那么它应该被声明为myViewController。根据描述,parent 的实际类型很可能是可变的,而 UIViewController 是通用基础。在这种情况下,是的,最终需要向下转换为正确的类型(或id - 这比向下转换更糟糕)。
  • 对我来说根本不是那样的。
【解决方案2】:

用正确的类声明指针,而不仅仅是 UIViewController。

为避免循环声明,请使用@class MyOwningViewController;。例如,MyContainedViewController.h:

@class MyOwningViewController;
@interface MyContainedViewController {
    MyOwningViewController* owningViewController;
}
@property (weak, nonatomic) MyOwningViewController* owningViewController;
@end;

但在 MyContainedViewController.m 中包含通常的 MyOwningViewController.h(除了可能在 MyOwningViewController.m 中包含 MyContainedViewController.h)。

MyOwningViewController.h:

#import "MyContainedViewConroller.h"  // Though you could use @class here as well
@interface MyOwningViewController {
    MyContainedViewController* containedViewController;  
}
@property (strong, nonatomic)  MyContainedViewController* containedViewController;
-(void) myMethod;
@end;

最后,在 MyContainedViewController.m 中:

#import "MyOwningViewController.h"

...

-(void) doSomething {
   [owningViewController myMethod];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-07
    • 2018-11-23
    • 2019-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-24
    • 2013-04-08
    相关资源
    最近更新 更多