如何在 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 方法(在继承层次结构的所有级别,所以在ViewControllerNewClass 中)。这是您打印出 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)的主要内容,如果未能解决你的问题,请参考以下文章

IOS之Objective-C学习 代理设计模式

如何在 Flutter 插件的 Swift 编写的 iOS 部分中使用 Objective-C 框架

如何在 iOS 的 Objective-C 中使用对齐区域编程拖放

iOS本地化在Xcode中不适用于Objective-C中的自定义标签[关闭]

Objective-C 多重继承

如何在 iOS Objective-C 中集成“使用 Apple 登录”流程?