gpt4 book ai didi

objective-c - 在初始化时返回其他对象

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

我在很多地方都读到过,您应该始终像这样初始化 Objective-C 对象:

- (id) init {
if (self = [super init]) {
....
}
return self;
}

因为 super 的 init 方法可能会返回一个与当前 self 不同的对象。

现在我正在尝试做这样的事情,我不确定我是否做对了,相对于保留和释放应该如何工作:

- (id) init:(int)idx {
id obj = [Cache findSelf:idx];
if (obj) {
[self release];
self = [obj retain];
} else {
self = [self doLoad];
}
return self;
}

我很好奇这是否是保留和释放 selfobj 的正确方法。有没有更好的办法?

最佳答案

你对 self = [super init] 部分是正确的,因为一些 Cocoa 类实际上确实返回了一个与分配的对象不同的对象。然而,这是异常(exception)而不是规则,在您自己的代码中这样做应该非常罕见,或者根本不会这样做。尽管拦截 -init 调用可能很诱人,但您将违背既定惯例的原则以及 Objective-C 程序员期望代码执行的操作。

这种类型的 -init 方法通常是一种不好的方法,因为 -init 方法应该尽可能简单,并且应该真正关注对象的初始化。我可能会写一个像这样的便捷方法:

+ (id) instanceForIndex:(NSUInteger)index {
id obj = [Cache findSelf:index];
if (obj == nil) {
obj = [[self alloc] init];
// Add to cache
}
return [[object retain] autorelease];
}

然后调用此方法而不是 -init。这将使 -init 逻辑更加清晰。

此外,我不确定您的 Cache 类是做什么的,但可能值得重新考虑该实现,并使用隐藏的静态变量来存储实例(例如,NSMutableDictionary,其中key 是从索引创建的 NSNumber)。 This SO question可能有用。

关于objective-c - 在初始化时返回其他对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1178631/

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