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

Kop*_*Bob 5 iphone model-view-controller objective-c ios

我刚开始学习iOS编程,我的继承问题.有2个文件.

第一个文件

#import <UIKit/UIKit.h>
@interface ViewController : UIViewController {
    int x;
}
@end
Run Code Online (Sandbox Code Playgroud)

执行:

#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
Run Code Online (Sandbox Code Playgroud)

第二档

标题:

#import "ViewController.h"

@interface NewClass : ViewController 
@end
Run Code Online (Sandbox Code Playgroud)

执行:

#import "NewClass.h"
@implementation NewClass

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

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

我在哪里弄错了?

Jos*_*rey 8

你有时间问题.

  1. init方法被称为第一次(在继承层次结构的各个层面,所以在这两个ViewControllerNewClass).这是当你打印出你的值时x,它仍然为零.

  2. viewDidLoad方法仅在稍后调用,通常在将视图控制器的视图添加到超级视图之后的某个点.它的功能是特定于UIViewController课程的.

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

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

正如sidyll所说,你应该多做一些关于继承是如何工作的阅读,我害怕!


sid*_*yll 6

您需要检查OOP概念.使用Objective-C进行面向对象的编程是必须的.

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

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