gpt4 book ai didi

objective-c - 使用相同命名属性的子类和父类(super class)问题

转载 作者:太空狗 更新时间:2023-10-30 03:38:20 24 4
gpt4 key购买 nike

这是我今天观察到的非常有趣的事情。也许这就是 Objective-C 的工作方式,但我对此一无所知。请参见下面的代码:

// ATableViewController.h
@interface ATableViewController : UITableViewController
@end

// ATableViewController.m
@interface ATableViewController ()
@property (nonatomic) int volly;
@end

@implementation ATableViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.volly = 5;
}
@end

// BTableViewController.h
@interface BTableViewController : ATableViewController
@end

// BTableViewController.m
@interface BTableViewController ()
@property (nonatomic) int volly;
@end

@implementation BTableViewController
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"%d", self.volly); // returns 5
}
@end

我不确定为什么以上是有效的。我确实知道我将一条消息“volly”传递给了对象“self”,而对象“self”又可能查看了父类(super class)的值,但这些不应该被初始化吗?一些解释会很有帮助。谢谢。

编辑:不过,这是 IMO 的一个大问题。考虑到我不知道父类(super class)中定义的任何私有(private)属性,我自己的一组值最终可能会有所不同。

例如,开发人员可以在 viewDidAppear: 中设置 bool 标志 hasAppeared。在 [super viewDidAppear:] 调用之后,将在 viewDidAppear: 中为我的子类实例设置相同的值。这将是在我真正开始自己设置之前。

目前,解决方案是我确切地知道父类(super class)使用的变量,我可以避免使用相同的值,但我认为这是一个比看起来更严重的问题。

编辑 2:该行为与二进制文件(只有 header )以及实现可用的框架一致。

最佳答案

我在没有阅读所有评论的情况下回答这个问题。

这里没有问题。 AViewController (AVC) 和 BViewController (BVC) 都有自己的私有(private)属性 volly.

您创建了一个 BVC 的实例。它看不到其父类的 volly 属性(因为它是私有(private)的),只能看到它自己的属性。

现在乐趣开始了。

BVC 中的viewDidLoad 方法被调用。它依次调用 [super viewDidLoad];,这当然会调用 AVC 类中的 viewDidLoad。该方法依次调用 self.volly = 5;

混淆似乎与这一行有关。请记住,self.volly = 5; 实际上是对以下内容的调用:

[self setVolly:5];

AVCBVC 都有(合成的)setVolly: 方法。由于 self 是指向 BVC 对象实例的指针,因此调用 [self setVolly:5]; 会导致调用setVolly: BVC 类中的方法,尽管是从 AVC 类中的方法调用的。

这是带有一些注释的代码:

“BVC”类:

- (void)viewDidLoad
{
[super viewDidLoad]; // calls the method in `AVC`
NSLog(@"%d", self.volly); // returns 5
}

“AVC”类:

- (void)viewDidLoad
{
[super viewDidLoad]; // calls the UITableViewController method
// The following is really [self setVolly:5];
// Since "self" is a "BVC", the private "volly" property of
// the "BVC" class is actually set here.
// The private "volly" property of the "AVC" class will still be
// 0 after this call.
self.volly = 5;
}

最终,子类没有使用父类的私有(private)属性。问题标题中的原始前提不正确。

关于objective-c - 使用相同命名属性的子类和父类(super class)问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29978818/

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