【问题标题】:Why is my app crashes using __autoreleasing + __strong?为什么我的应用程序使用 __autoreleasing + __strong 会崩溃?
【发布时间】:2013-05-03 17:24:05
【问题描述】:

这是我的代码:

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;
}

痕迹(抱歉,不能复制粘贴):

问题是:发生了什么事?

我需要有关此代码中发生的情况的详细信息。十分有趣... 仪器没有显示任何泄漏、僵尸等。

【问题讨论】:

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


    【解决方案1】:

    initWithDomain:code:userInfo: 是 NSError 的指定初始化器。这意味着不要直接调用init

    只要这样说,你就会遇到同样的崩溃:

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

    这个问题与自动引用计数、自动释放、自动释放池、强或任何其他东西无关!只是您正在创建一个错误的 NSError 对象,然后尝试记录它。

    【讨论】:

    • 你能解释一下,引擎盖下到底发生了什么吗?
    • 是的,我可以! :) NSLog 让你崩溃。你正在制作一个无效的 NSError 对象。当您尝试记录它时,NSLog 会向您的 NSError 对象发送description 消息。但它是无效的,所以它没有description
    • (嗯,它有一个description 方法,但该方法调用localizedDescription,这就是问题的根源。)
    • 我认为这是一个库错误。它应该在初始化时或description 时抛出异常。
    • init 应该使用合理的默认参数调用指定的初始化程序。如果你愿意,我会提交一个错误!
    猜你喜欢
    • 2012-01-24
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多