Iphone 如何在objective-C(iOS sdk)中使用继承
我刚开始学习iOS编程,继承方面有问题。有两个文件 第一个文件 标题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
#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教程!