如何在 Objective-C 中使用继承(iOS sdk)
Posted
技术标签:
【中文标题】如何在 Objective-C 中使用继承(iOS sdk)【英文标题】:How to work with inheritance in objective-C (iOS sdk) 【发布时间】:2012-01-18 17:40:55 【问题描述】:我刚开始学习 ios 编程,遇到了继承问题。有 2 个文件。
第一个文件
标题
#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。
我在哪里做错了?
【问题讨论】:
当我在 NewClass 中调用 NSLog(@"%i",x) 时,我想看到 999。如何解决什么问题? 【参考方案1】:您遇到了时间问题。
首先调用init
方法(在继承层次结构的所有级别,所以在ViewController
和NewClass
中)。这是您打印出 x
的值时,它仍然为零。
viewDidLoad
方法只会在很久以后才被调用,通常是在视图控制器的视图添加到父视图之后的某个时间点。这是UIViewController
类特有的功能。
为了使您的示例有效,请在您的 ViewController
类中添加一个 init
方法,该方法与您的 NewClass
类中的方法相似,并在此处设置 x。
另外,您不需要在ViewController
中创建NewClass
实例。当您创建 NewClass
对象时,它也会自动成为 ViewController
。就像狗自动成为动物一样,猫也是如此。当你创造一只狗时,你不想同时创造一只动物!
正如 sidyll 所说,恐怕您应该多读一些关于继承如何工作的文章!
【讨论】:
但是为什么我不需要在 ViewController 中创建 NewClass ,如果我不做什么,我如何在 NewClass 中调用 init 方法? 如果你这样做:[[NewClass alloc] init]
,那么它会首先调用NewClass的init方法。这将依次调用 ViewController 的 init 方法(因为您执行 [super init]
),然后返回到您的 NewClass 以运行您的 NSLog 代码。说真的,阅读更多 OOP 教程!【参考方案2】:
这是因为 -viewDidLoad
直到 -init
返回之后才被调用。您的超类应该在其 -init
方法中进行类似的配置。
【讨论】:
【参考方案3】:您需要复习 OOP 概念。 Object-Oriented Programming with Objective-C 是必须的。
您的类NewClass
确实继承了x
变量,但不是它的值。当您创建它的实例时,您正在创建一个闪亮的新实例,其值与父类无关。
另一个对您有帮助的观点是x
被设置在ViewController
类的对象中。 NewClass
继承自 ViewController
类,而不是任意实例(对象,您在其中设置 x
)。
【讨论】:
以上是关于如何在 Objective-C 中使用继承(iOS sdk)的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Flutter 插件的 Swift 编写的 iOS 部分中使用 Objective-C 框架
如何在 iOS 的 Objective-C 中使用对齐区域编程拖放