【问题标题】:Using superclass instance method in Objective-C在 Objective-C 中使用超类实例方法
【发布时间】:2014-12-19 12:31:07
【问题描述】:

我对在 Objective-C 中使用 instancetype 感到困惑。

代码:

@interface MyClass : NSObject

-(instancetype)initWithOwner:(NSString*)anOwner;

@property (nonatomic, strong) NSString* owner;
@end


@interface MyChildClass : MyClass

-(instancetype)init;

@property (nonatomic, strong) NSString* myString;
@end

然后,我可以运行它

MyChildClass* myChildObject = [[MyChildClass alloc] initWithOwner:@"owner"];

为什么这会返回 MyChildClass 而不是 MyClass ???

为什么编译器不显示任何警告或错误消息,说明我使用的是超类的初始化方法,而不是 MyChildClass 初始化方法???

我在哪里可以使用这个???

【问题讨论】:

    标签: objective-c inheritance factory factory-method instancetype


    【解决方案1】:
    1. 问题(问号 1 到 3)

    这是因为instancetype。它说:返回实例与接收者的类型(或子类)相同。

    [[MyChildClass alloc] initWithOwner:@"owner"];
    

    意思:

    [[MyChildClass alloc] -> MyChildClass
                                          initWithOwner:@"owner"] -> MyChildClass;
    
    1. 问题(问号 4 到 6)

    一个。 Objective-C 中没有工厂方法。 Objective-C 中有一些方法。

    b.编译器没有显示警告,因为一切都很好。您将对MyChildClass 的引用分配给MyChildClass 类型的引用变量。

    1. 问题(问号 7 到 9)

    您可以在示例中使用它。 MyChildClass 可以使用基类实现,如果它不想改变它。 (经常。)

    BTW:你知道返回的实例的类型是MyChildClass吗?

    【讨论】:

    • 我已经用 NSLog(@"%@", [myChildObject className]);它是 MyChildClass。据我了解,这将是 MyChildClass,因为 alloc 方法返回 MyChildClass。
    • 根据你的回答,如果我不想改变我的超类实例方法,我应该使用这个。但是在 MyChildClass @implementation 中覆盖这个方法不是更好吗?在那个实现中,我设置了 self = [super initWithOwner:...];然后我将我的属性设置为默认值,因为当我调用超类实例方法时,MyChildClass 属性被分配为 NULL,如果我以后不检查它,我会在使用这个属性时遇到问题。关键是:使用超类实例方法覆盖它们不是更好吗?
    • 1.对于+alloc,这不适用。 2. 对于-init…,它取决于初始化程序,尤其是。如果它是指定或辅助初始化程序。但是,调用-init… (super) 会导致“问题”,即初始化程序必须是id 类型,这更糟。如今,出于这个原因,对于初始化程序,id 会自动替换为 instancetype
    • 不确定您试图通过声明“Objective-C 中没有工厂方法”来表达什么意思,但这是不正确的。来自 Apple 的 Objective-C Programming 中的概念:“类工厂方法由一个类实现,以方便客户。它们将分配和初始化结合在一个步骤中,并返回创建的对象。”
    • 这是一个与 Objective-C 无关的约定。与其他编程语言相比,Objective-C 没有语言级别的对象创建概念。所以它们没有什么特别之处,instancetype 以完全相同的方式应用于所有其他方法。 (ARC 通过方法名称做出一些假设,但这是针对与 MRR 相关的遗留问题。)因此引用与约定有关,但与语言概念无关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    相关资源
    最近更新 更多