如果 initWithX 失败,分配会发生什么情况?

发布于 2024-10-26 13:21:37 字数 331 浏览 2 评论 0原文

在 Objective-C 中编写 MyClass* obj = [[MyClass alloc] initWithX:X] 是常见的做法。 initWithX 通常定义为

- (MyClass*) initWithX: (MyArgClass*) X {
    if (self = [super init])  {
        // initialize
    }
    return self;
} 

我的问题是:如果初始化失败怎么办?我不想抛出异常,但是,如何指示错误?如果我返回nil,调用者将无法释放指针。

It is common practice to write MyClass* obj = [[MyClass alloc] initWithX:X] in Objective-C. initWithX is usually defined as

- (MyClass*) initWithX: (MyArgClass*) X {
    if (self = [super init])  {
        // initialize
    }
    return self;
} 

My question is: what if initialize fails? I don't want to throw exceptions, but, how do I indicate error? If I return nil, the caller will not be able to release the pointer.

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

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

发布评论

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

评论(2

如若梦似彩虹 2024-11-02 13:21:37

如果初始化由于任何原因失败,你应该释放 self.对于初始化过程中可能发生的异常,您需要根据需要添加 @try @catch 以便您可以释放 self

- (MyClass*) initWithX: (MyArgClass*) X {
    if (self = [super init])  {
        // initialize
        if(myInitializationCodeFailed)
        {
                [self release];
                return nil;
        }
    }
    return self;
}

更新

如果您的初始化可能失败,我不会在您的初始化代码中引发异常。如果您想向调用者提供信息,我将重构初始化程序以接受 NSError 返回。

- (MyClass*) initWithX: (MyArgClass*) X error:(NSError**)error {

正如 Alexei Sholik 在评论中指出的那样,请查看 分配和初始化对象的处理初始化失败部分。

If initialization fails for any reason you should release self. For an exception that may occur in your initialization you need to add you @try @catch as appropriate so you can release self.

- (MyClass*) initWithX: (MyArgClass*) X {
    if (self = [super init])  {
        // initialize
        if(myInitializationCodeFailed)
        {
                [self release];
                return nil;
        }
    }
    return self;
}

Update

If it is possible for your initialization fail I would not raise an exception from with in your initialization code. If you would like to provide the caller with information I would refactor the initializer to accept an NSError to be returned.

- (MyClass*) initWithX: (MyArgClass*) X error:(NSError**)error {

As Alexei Sholik points in the comments check out the Handling Initialization Failure section of Allocating and Initializing Objects.

_蜘蛛 2024-11-02 13:21:37

基本上, 回答了你的问题。

处理初始化失败

一般来说,如果初始化方法出现问题,您应该调用 self 上的 release 方法并返回 nil。< /p>

该政策有两个主要后果:

  • 任何从初始化方法接收 nil 的对象(无论是您自己的类、子类还是外部调用者)都应该能够处理它。在不太可能的情况下,调用者在调用之前已经建立了对该对象的任何外部引用,您必须撤消所有连接。
  • 您必须确保 dealloc 方法在存在部分初始化的对象时是安全的。

...

Basically, this answers your question.

Handling Initialization Failure

In general, if there is a problem during an initialization method, you should call the release method on self and return nil.

There are two main consequences of this policy:

  • Any object (whether your own class, a subclass, or an external caller) that receives nil from an initializer method should be able to deal with it. In the unlikely case that the caller has established any external references to the object before the call, you must undo any connections.
  • You must make sure that dealloc methods are safe in the presence of partially initialized objects.

...

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