如何在Objective-C(iOS SDK)中使用继承

5
我刚刚开始学习iOS编程,我在继承方面遇到了问题。有两个文件。
第一个文件
头文件
#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

Second file

Header:

#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。如何解决这个问题? - KopBob
3个回答

8
您的问题在于时序。
  1. 首先调用init方法(在继承层次结构的所有级别中都会调用,因此在ViewControllerNewClass中都会调用)。这是您打印出变量x值的时候,它仍然为零的原因。

  2. viewDidLoad方法通常在视图控制器的视图添加到父视图后才被调用。它是特定于UIViewController类的功能。

要使示例工作,请在您的ViewController类中放置一个类似于NewClass类的init方法,并在那里设置x值。
此外,在ViewController内部不需要创建NewClass实例。当您创建NewClass对象时,它自动成为ViewController。就像狗和猫都是动物一样,当您创建狗时,不需要再创建动物!
正如sidyll所说,您可能需要更多地阅读关于继承如何工作的内容!

但是为什么我不需要在ViewController中创建NewClass,如果我不这样做,我怎么能调用NewClass的init方法呢? - KopBob
如果你输入[[NewClass alloc] init],那么它会首先调用NewClass的init方法。这将依次调用ViewController的init方法(因为你执行了[super init]),然后返回到NewClass以运行NSLog代码。真的,请阅读更多的OOP教程! - Joseph Humfrey

6

您需要重新审视面向对象编程的概念。使用Objective-C进行面向对象编程是必不可少的,可以参考Object-Oriented Programming with Objective-C

NewClass类确实继承了x变量,但没有继承它的值。当您创建一个实例时,您创建了一个全新的实例,其值与父类无关。

另一个帮助您理解的角度是,xViewController类的对象中设置。 NewClass类从ViewController继承,而不是任意实例(对象,在其中设置x)。


0
这是因为 -viewDidLoad 直到 -init 返回后才被调用。你的超类应该在它的 -init 方法中进行这样的配置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接