Iphone 如何在objective-C(iOS sdk)中使用继承

Iphone 如何在objective-C(iOS sdk)中使用继承,iphone,objective-c,ios,model-view-controller,Iphone,Objective C,Ios,Model View Controller,我刚开始学习iOS编程,继承方面有问题。有两个文件 第一个文件 标题 #import <UIKit/UIKit.h> @interface ViewController : UIViewController { int x; } @end 第二个文件 标题: #import "ViewController.h" @interface NewClass : ViewController @end 实施: #import "ViewController.h" #impor

我刚开始学习iOS编程,继承方面有问题。有两个文件

第一个文件

标题

#import <UIKit/UIKit.h>
@interface ViewController : UIViewController {
    int x;
}
@end
第二个文件

标题:

#import "ViewController.h"

@interface NewClass : ViewController 
@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 "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


我在哪里犯了错误?

您需要回顾一下OOP概念。这是必须的

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


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

这是因为
-viewDidLoad
-init
返回后很久才会调用。你的超类应该像它的
-init
方法那样进行配置。

你有一个计时问题

  • 首先调用
    init
    方法(在继承层次结构的所有级别,因此在
    ViewController
    NewClass
    中)。这是当您打印出
    x
    的值时,它仍然为零

  • viewDidLoad
    方法只能在很久以后调用,通常是在视图控制器的视图添加到superview之后。这是特定于
    UIViewController
    类的功能

  • 要使示例正常工作,请在
    ViewController
    类中放置一个类似于
    NewClass
    类的
    init
    方法,并在其中设置x

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


    正如西迪尔所说,恐怕你应该多读一点关于继承是如何工作的

    当我在NewClass中调用NSLog(@“%i”,x)时,我希望看到999。如何解决什么问题?但为什么我不需要在ViewController中创建NewClass,如果我不做什么,我如何在NewClass中调用init方法?如果您这样做:
    [[NewClass alloc]init]
    ,那么它将首先调用NewClass的init方法。这将依次调用ViewController的init方法(因为您执行了
    [super init]
    ),然后返回到新类运行NSLog代码。说真的,请阅读更多OOP教程!