obj-c 中 init 模式的目的及其使用

发布于 2024-12-25 02:03:37 字数 264 浏览 3 评论 0原文

初始化器模式的目的是什么,除了为了确保在 init 方法执行初始化之前,对象由其超类正确初始化。

为什么这是必要的?

我们有一个类有多个初始化方法时,为什么其他人应该调用专用初始化程序而不是超类初始化程序?

我来自java背景,所以不完全理解这一点 - 我在java中可以匹配的最接近的是单例模式,但其他调用专用初始化程序的部分对我来说没有意义,因为在java中你有一个选择,而不是你“应该”。

任何人都可以详细说明....thx

What is the purpose of the initializer pattern other then in order to assure that the object is properly initialized by its superclass before the init method performs its initialisation.

Why is this necessary?

and

when we have a class which has more than one initialization method, why others shoud call the dedicated initialiser instead of superclass initialiser?

I'm coming from java background so don't fully understand this - the closest i could match in java was singleton pattern but the part others calling dedicated initialiser didn't make sense to me as in java you have a choice rather then you "should".

can any one elaborate....thx

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

以酷 2025-01-01 02:03:37
  1. 初始化器模式是必要的,因为您正在调用其初始化器的super类可以返回任何类型的对象,不一定是该类的实例。这就是 NSString 的工作原理,它实际上是一组类,实现了针对不同使用模式优化的不同类型的字符串。因此,为 NSString 后代调用 self = [super init] 会使 self 成为一个 NSCFString 实例。

  2. Objective C 中有一种称为“指定初始化器”的模式。如果类有多个初始化器,则选择其中一个作为指定初始化器,而所有其他的都应该通过调用它来实现,而不是通过 super 来实现。这对于正确重写子类中的初始值设定项非常重要,您应该仅初始化指定的初始值设定项,并且在所有情况下都会调用它(当然,假设您的代码编写良好并且利用了指定的初始值设定项:)

  1. The initializer pattern is necessary, because the super class whose initializer you are calling, can return any kind of object, not necessarily the instance of that class. That's how, for example, NSString works, it's actually a cluster of classes implementing different kinds of strings optimized for different usage patterns. So calling self = [super init] for NSString descendant makes self, for example, an NSCFString instance.

  2. There's a pattern called Designated Initializer in Objective C. If the class has many initializer, one of them is chosen as designated, and all the other should be implemented by calling it, not the super. This is important for correctly overriding initializers in child classes, you should initialize only the designated one, and it will be called under all circumstances (assuming your code is well-written and takes advantage of designated initializers, of course :)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文