gpt4 book ai didi

objective-c - 在 Obj-C 初始化程序期间管理引用计数的惯用方法是什么?

转载 作者:搜寻专家 更新时间:2023-10-30 19:56:53 25 4
gpt4 key购买 nike

我正在学习 Objective-C。在我的第一个重要项目中,我遇到了一个问题,即与默认初始化程序相比,如何最好地处理传递给初始化程序的资源。我的类有一个保留资源engine,可以在创建后手动设置,也可以在初始化时显式设置,也可以在默认初始化时设置:

- (id)init {
if ((self = [super init])) {
id e = [[XorShiftEngine alloc] init];
[self setEngine: e];
[e release];
}
return self;
}

- (id)initWithEngine:(NSObject <RandEngine> *)e {
if ((self = [super init]))
[self setEngine: e];
return self;
}

- (id)setEngine:(NSObject <RandEngine> *)newEngine {
[newEngine retain];
[engine release];
engine = newEngine;
// Some other stuff which needs to happen on changing the engine.
return engine;
}

尤其是默认初始化程序,对我来说似乎非常丑陋,交织与 self 相关的代码,然后是 member,然后是 self,然后是 member,并命名对象只是为了以后能够释放它。它还违反了指定的初始化程序习语。

有没有不使用自动释放池的更惯用的方法来做到这一点?

最佳答案

你是在谈论 -init 中的 e 吗?我没有看到那里的问题......你创建一个对象,你使用它,你释放它。这是创建和使用对象的通常且正确的模式。不过,如果您对此不满意,您可以让 -init 将 nil 传递给 -initWithEngine: 并让 -initWithEngine: 创建如果没有提供引擎。

人们通常不会谈论“默认初始化器”,而是谈论“指定初始化器”。指定初始化器是所有其他初始化器调用的初始化器——它通常是允许最多自定义的初始化器。在这种情况下,-initWithEngine: 是您指定的初始化程序。

关于objective-c - 在 Obj-C 初始化程序期间管理引用计数的惯用方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5970049/

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