2011-12-12 53 views
5

我刚开始学习iOS编程,并遇到继承问题。有2个文件。如何在Objective-C中使用继承(iOS sdk)

第一个文件

页眉

#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.1

在哪里我做一个失误?

+0

当我在NewClass中调用NSLog(@“%i”,x)时,我想看到999.如何解决什么问题? – KopBob

回答

8

您有计时问题。

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

  2. viewDidLoad方法稍后才会调用,通常在视图控制器视图添加到超级视图后的某个点。它的功能特定于UIViewController类。

为了使您的工作例如,把一个init方法在ViewController类,看起来像一个在你NewClass类,并设置X那里。

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

正如sidyll所说,你应该多做一点关于继承如何工作的知识,恐怕!

+0

Thx。现在它的工作) – KopBob

+0

但为什么我不需要在ViewController内创建NewClass,如果我不做什么,我可以如何在NewClass中调用init方法? – KopBob

+0

如果你这样做:'[[NewClass alloc] init]',那么它将首先调用NewClass的init方法。这将依次调用ViewController的init方法(因为你执行'[super init]'),然后返回NewClass来运行你的NSLog代码。认真阅读更多OOP教程! –

6

你需要检讨你的面向对象的概念。 Object-Oriented Programming with Objective-C是必须的。

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

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

+0

Thx!你是对的,我需要了解更多关于OOP的知识。 – KopBob

0

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