gpt4 book ai didi

objective-c - 自定义初始化失败时如何清理内存

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

当我的自定义初始化程序失败时,我应该返回 nil。清理我在初始化程序中分配的任何内存的约定是什么,我期望在 dealloc 中清理?

这是一个人为的例子:

- (id)init
{
if ((self = [super init])) {
instanceVar1 = [[NSString alloc] initWithString:@"blah"];
if (bad_thing_oh_noes) {
return nil;
}
}
return self;
}

- (void)dealloc
{
[instanceVar1 release];

[super dealloc];
}

我无法在分配之前有效地检查每个错误条件的更现实的情况是反序列化包含数组等的复杂对象。

无论如何,我是在返回 nil 之前清理分配的内存,还是在返回 nil 之前向 self 发送 dealloc 消息,还是所有这些都神奇地为我管理?

最佳答案

如果在初始化过程中发生错误,您应该在self 上调用release 并返回nil

if (bad_thing_oh_noes) {
[self release];
return nil;
}

此外,您必须确保在部分初始化的对象上调用 dealloc 是安全的。

您应该只在失败时调用release。如果您从父类(super class)的初始值设定项返回 nil,则不应调用 release

通常情况下,您不应该在初始化失败时抛出异常。

来自 Handling Initialization Failure 的示例:

- (id)initWithURL:(NSURL *)aURL error:(NSError **)errorPtr {

self = [super init];
if (self) {

NSData *data = [[NSData alloc] initWithContentsOfURL:aURL
options:NSUncachedRead error:errorPtr];

if (data == nil) {
// In this case the error object is created in the NSData initializer
[self release];
return nil;
}
// implementation continues...

关于objective-c - 自定义初始化失败时如何清理内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6849995/

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