gpt4 book ai didi

objective-c - 父类(super class)] 构造

转载 作者:行者123 更新时间:2023-12-03 17:43:42 24 4
gpt4 key购买 nike

简单地说,我有一个类实现:

@implementation ClassB: ClassA
-(id) init {
if (self = [super init]) {
...
}
return self;
}
@end

还有一个类别,有两种变体:

1:

@implementation ClassA (ClassA_Category)
+(id) alloc {
if ([self isEqual: [ClassA class]]) {
return [ClassB alloc];
} else {
return [super alloc];
}
}
@end

2:

@implementation ClassA (ClassA_Category)
+(id) alloc {
return [[ClassB superclass] superclass] alloc];
}
@end

问题是关于这个简单的初始化:

ClassA *aObj = [[ClassA alloc] init];

对于第一个类别变体,ClassBinit 被调用,但对于第二种情况 - 则不会。

为什么?这两个 alloc 结构具有相同的含义吗?

最佳答案

[[ClassB superclass] superclass] 将是 ClassA 的父类(super class)(可能是 NSObject - 我将在这个答案的其余部分假设如此)。所以第二个变体具体相当于[NSObject alloc]。这意味着您发送 init 到的对象只是一个 NSObject,而不是 ClassA 或 ClassB。

在第一个变体中,[ClassB alloc] 执行 ClassA 的实现(通过继承),在类不是 ClassA 的情况下调用 [super alloc]( ClassB 则不然),它执行 alloc 的默认实现。这会分配一个 ClassB,然后发送 init

我认为您的困惑是由于 [[self superclass] theCurrentMethod] 等同于 [super theCurrentMethod] 的假设引起的。它不是。 super 关键字使接收者 (self) 保持不变,但在将该消息解析为特定实现时只是跳过当前类。但是,当您显式向[self superclass]发送消息时,父类(super class)本身就是接收者。

关于objective-c - 父类(super class)] 构造,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5085349/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com