如何使用+ [NSException raise:format:arguments:]没有内存泄漏?

时间:2014-08-07 11:39:30

标签: objective-c exception-handling nsexception

我正在编写一个自定义断言宏,当断言失败时,这个函数被称为

void _XLCAssertionFailedCritical(NSString *format, ...)
{
    va_list ap;
    va_start(ap, format);

    // this suppose to throw exception
    [NSException raise:NSInternalInconsistencyException format:format arguments:ap];

    va_end(ap); // <---- this line is unreachable? 
}

但后来我意识到这个函数有内存泄漏... va_end(ap);无法访问。

我可以使用其他方法来创建和抛出异常,但这种方法只是困扰我。在没有内存泄漏的情况下似乎无法使用它?

我理解异常并不是假设在正常的控制流中发生的事情,但即使在特殊情况下,我仍然希望编写无内存泄漏的问题。

这个方法意味着一个方便的方法,所以用一些格式字符串引发异常可以更简单。但是内存泄漏的代价呢?

1 个答案:

答案 0 :(得分:0)

我不确定这是否会导致泄漏,特别是如果它是一个断言它是致命的,但它看起来不是很好。我建议格式化字符串,然后将其直接传递给[NSException raise:format:]

void _XLCAssertionFailedCritical(NSString *format, ...)
{
    va_list ap;
    va_start(ap, format);
    NSString *message = [[NSString alloc] initWithFormat:format
                                               arguments:ap];
    va_end(ap);

    [NSException raise:NSInternalInconsistencyException
                format:@"%@", message];
}