为什么我的应用程序崩溃使用__autoreleasing + __strong?

时间:2013-05-03 17:24:06

标签: automatic-ref-counting autorelease nsautoreleasepool strong-references

这是我的代码:

void autoreleasingReturn (NSError * __autoreleasing *error)
{
    // --- Crashing
    *error = [[NSError alloc] init];

    // --- Not crashing
//    *error = [NSError errorWithDomain:@"hello"
//                                 code:-1
//                             userInfo:@{}];
}

int main(int argc, const char * argv[])
{

    @autoreleasepool {

        NSError __strong *error = nil;

        autoreleasingReturn(&error);

        NSLog(@"error: %@", error); // crash!
    }

    return 0;
}

跟踪(抱歉,无法复制粘贴):

enter image description here

问题是:发生了什么?

我需要详细了解此代码中发生的事情。非常有意思... 仪器不显示任何泄漏,僵尸等。

1 个答案:

答案 0 :(得分:2)

initWithDomain:code:userInfo:是NSError的指定初始化程序。这意味着不要调用普通init

只要这样说就可以得到同样的崩溃:

NSLog(@"%@", [[NSError alloc] init]);

问题与自动引用计数,自动释放,自动释放池,强大或任何其他东西无关!只是你正在制作一个糟糕的NSError对象,然后尝试记录它。