【问题标题】:How to work with inheritance in objective-C (iOS sdk)如何在 Objective-C 中使用继承(iOS sdk)
【发布时间】:2012-01-18 17:40:55
【问题描述】:

我刚开始学习 iOS 编程,遇到了继承问题。有 2 个文件。

第一个文件

标题

#import <UIKit/UIKit.h>
@interface ViewController : UIViewController {
    int x;
}
@end

实施:

#import "ViewController.h"
#import "NewClass.h"
@implementation ViewController
#pragma mark - View lifecycle
- (void)viewDidLoad
{
    [super viewDidLoad];
    x = 999;
    NewClass *myClass = [[[NewClass alloc] init] autorelease];
}
@end

第二个文件

标题:

#import "ViewController.h"

@interface NewClass : ViewController 
@end

实施:

#import "NewClass.h"
@implementation NewClass

-(id)init { 
    self = [super init];                                       
    if (self != nil) {                                            
        NSLog(@"%i",x);
    }
    return self;                           
}
@end

在 ViewController 中我将 x 设置为 999,在 NewClass 中我想得到它,但是当我调用 NSLog(@"%i",x); 时它给了我 0。

我在哪里做错了?

【问题讨论】:

  • 当我在 NewClass 中调用 NSLog(@"%i",x) 时,我想看到 999。如何解决什么问题?

标签: iphone objective-c ios model-view-controller


【解决方案1】:

您遇到了时间问题。

  1. 首先调用init 方法(在继承层次结构的所有级别,所以在ViewControllerNewClass 中)。这是您打印出 x 的值时,它仍然为零。

  2. viewDidLoad 方法只会在很久以后才被调用,通常是在视图控制器的视图添加到父视图之后的某个时间点。这是UIViewController 类特有的功能。

为了使您的示例有效,请在您的 ViewController 类中添加一个 init 方法,该方法与您的 NewClass 类中的方法相似,并在此处设置 x。

另外,您不需要在ViewController 中创建NewClass 实例。当您创建 NewClass 对象时,它也会自动成为 ViewController。就像狗自动成为动物一样,猫也是如此。当你创造一只狗时,你不想同时创造一只动物!

正如 sidyll 所说,恐怕您应该多读一些关于继承如何工作的文章!

【讨论】:

  • 但是为什么我不需要在 ViewController 中创建 NewClass ,如果我不做什么,我如何在 NewClass 中调用 init 方法?
  • 如果你这样做:[[NewClass alloc] init],那么它会首先调用NewClass的init方法。这将依次调用 ViewController 的 init 方法(因为您执行 [super init]),然后返回到您的 NewClass 以运行您的 NSLog 代码。说真的,阅读更多 OOP 教程!
【解决方案2】:

这是因为 -viewDidLoad 直到 -init 返回之后才被调用。您的超类应该在其 -init 方法中进行类似的配置。

【讨论】:

    【解决方案3】:

    您需要复习 OOP 概念。 Object-Oriented Programming with Objective-C 是必须的。

    您的类NewClass 确实继承了x 变量,但不是它的值。当您创建它的实例时,您正在创建一个闪亮的新实例,其值与父类无关。

    另一个对您有帮助的观点是x 被设置在ViewController 类的对象中。 NewClass 继承自 ViewController ,而不是任意实例(对象,您在其中设置 x)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-05
      • 2012-03-10
      • 2013-09-26
      • 1970-01-01
      • 1970-01-01
      • 2011-05-10
      • 2014-03-08
      相关资源
      最近更新 更多