这是情况。假设我有一个名为MYFoo的课程。这是初始化程序:
-init
{
self = [super init];
if (self)
{
// during initialization, something goes wrong and an exception is raised
[NSException raise ...];
}
return self;
}
现在我想在其他地方使用MYFoo对象,所以我使用了一个常见的模式:
MYFoo *foo = [[[MYFoo alloc] init] autorelease];
但是会发生什么,即使第二部分有一个try / catch,也会分配一个MYFoo对象,抛出异常,自动释放错过,未初始化的MYFoo对象将泄漏。
这里应该发生什么来防止这种泄漏?
答案 0 :(得分:8)
Apple Docs说最佳做法不是扔掉。
处理初始化失败
一般来说,如果有问题 在初始化方法中,你 应该调用[自我释放]并返回 为零。
如果你需要知道发生了什么,你可以init
对象并拥有某种内部状态,由调用者检查以确保对象可用。
答案 1 :(得分:1)
ongle是100%正确的。但是如果你确实需要抛出一个异常,而你确实希望在某个地方捕获它(而不是只是避开应用程序),那么你可以将你的初始化包装在@try { ... } @finally { ... }
-init
{
self = [super init];
if (self)
{
@try
{
// during initialization, something goes wrong and an exception is raised
@throw...
}
@finally
{
[self release];
}
}
return self;
}
如果您执行上述操作,则应记录init方法可能引发异常,否则代码的其他用户将期望默认行为,并且可能不会编写异常安全代码。