【问题标题】:objc call grandparent method from outsideobjc 从外部调用祖父方法
【发布时间】:2018-03-01 20:49:10
【问题描述】:

我最近正在开发一个 iphone 应用程序,我觉得使用继承可以使结构更加合理和优雅。但是,我正在为继承如何在 objc 中工作而苦苦挣扎。 Java 中的继承约定在这里似乎不起作用。

情况:

这可能有点复杂,但这看起来是描述这种情况的最佳方式。假设我有 2 个班级,A 和 B。它们如下所示:

// Class A
@interface A: B
@end

@implementation A
- (id)init{
    self = [super init];
    if(self){
    }
    return self;
}
@end

// Class B
@interface B: NSObject
@property A *littleA;

- (void)doSomething;
- (void)blabla;
@end

@implementation B
- (id) init {
    self = [super init];

    if(self) {
        _littlea = [[A alloc] init]; // error: No known class method for selector 'alloc'
    }
    return self;
}

- (void)doSomething{
    NSLog(@"something");
}

- (void)blabla{
    [littleA doSomething]; // error: No visible @interface for 'A' declares the selector 'doSomething:'
}

@end

在这些类之外,还有一个 C 类。在 B 类中,我将“littleA”传递给 C 类的方法。在那种方法中,我做到了:

[littleA isEqual:NULL];// error: No visible @interface for 'A' declares the selector 

我完全被这些错误信息弄糊涂了。这是继承应该做的吗?在Java中,A扩展B,B扩展C,然后我可以从A调用:a.b的方法或a.c的方法。

我做错了什么?任何人都可以解释这三个错误消息将是一个很大的帮助!

【问题讨论】:

  • 这是您的代码的复制粘贴吗?如果是这样,您是否也收到有关"interface type cannot be statically allocated" 的警告?
  • 提示:@property A* littleA;(注意指针)Objective-C 对象不能“静态”分配。换句话说,你永远不可能有一个包含整个对象的变量;您只能声明一个包含对对象的引用的变量。
  • @Josh Caswell 和 James Bucanek 感谢您指出这一点。不幸的是,这是我在问题中的错字。我的所有对象属性都有 * 。我已经修复了问题中的代码。但是了解静态分配对象是件好事。我只知道指针和引用的区别,不知道它们是如何分配的:)
  • 第一行@interface A: B没有出错?此外,您是否知道A 是子类,而不是B?您可能应该将示例代码中的类重命名为 BaseClassSubclass 以使其更具可读性。此代码不是您的真实代码,您可能忘记导入 A

标签: objective-c xcode inheritance


【解决方案1】:

B 类中,您对属性littleA 的声明缺少星号(在Objective-C 中表示该变量是一个对象)。

@property A *littleA;

我认为这将清除您发布的错误。

【讨论】:

  • 对不起我的错字。代码中有*号。我已经在问题中添加了它。但这似乎不是错误的原因......
猜你喜欢
  • 1970-01-01
  • 2014-01-02
  • 2011-02-04
  • 1970-01-01
  • 1970-01-01
  • 2011-06-09
  • 2010-12-22
  • 2021-01-30
  • 1970-01-01
相关资源
最近更新 更多