gpt4 book ai didi

objective-c - Cocoa 中使用的两阶段创建方法的最大优点是什么?

转载 作者:行者123 更新时间:2023-12-03 16:50:04 24 4
gpt4 key购买 nike

我已经用 Objective-C 编程几年了,我目前正在写一篇关于大学语言的一些原则的小文章。

在这样做的过程中,我偶然发现了大多数 ObjC 程序员每天都会使用的 Cocoa 的两阶段创建方法(对于那些不熟悉这个术语的人来说,它是关于使用 [[MyObject alloc] initWithParameters: ...] 而不是使用其他语言中已知的常规构造函数)。

我读了《Cocoa Design Patterns》一书的章节,可以在网上找到here还有另一个版本 here .

但是,我还是没有真正明白这一点。让我们考虑第二个链接中的示例:

  • 作者研究了如果 NSString 使用经典构造函数而不是两阶段创建过程会发生什么

  • 他说这会很糟糕,因为如果您创建它的子类,您可能需要覆盖许多构造函数。

这对我来说并不清楚!如果您需要一些特定的变量初始化,您还需要编写与构造函数相同数量的不同初始化函数!如果您不必这样做,您也可以不实现构造函数并让调用转发到父类(super class)。

第一个链接中在不同内存区域创建图像的另一个示例对我来说更有意义。不过,我认为这太杜撰了,不真实。如果您只是将一个标志作为另一个参数传递来指定预期的内存区域,那么这个问题就可以解决,而无需构造函数的组合爆炸。另外,我不知道使用两阶段创建时如何解决这个问题。在这种情况下,您如何告诉您的构造函数它应该在 GPU 上分配而不是在普通 RAM 中分配?

很想听听您对此的想法!真的很想了解为什么会这样,以及它是否真的比经典构造函数更好。

最佳答案

@bbum a comment to a SO answer状态:

Historically, the separation was used to allow memory allocated via a different allocator to then be initialized as an object. This was abandoned long ago because it was too damned fragile at deallocation. The two stage allocator also allows classes to return a different, often cached already existing, instance upon initialization (which is common behavior in class clusters, but orthogonal to clusters).

请注意,如果没有参数,可以使用关键字 new 代替 alloc-init:

NSString *s = [NSString new];

这不再被认为是“坏形式”,一些较新的 Apple 文档使用这种形式。它的功能与以下内容相同:

NSString *s = [[NSString alloc] init];

关于objective-c - Cocoa 中使用的两阶段创建方法的最大优点是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21990940/

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