为啥我的应用程序使用 __autoreleasing + __strong 会崩溃?

Posted

技术标签:

【中文标题】为啥我的应用程序使用 __autoreleasing + __strong 会崩溃?【英文标题】: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;

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

问题是:发生了什么事?

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

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

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

以上是关于为啥我的应用程序使用 __autoreleasing + __strong 会崩溃?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Django 应用程序需要 `manage.py` 而不是使用 `__init__ py`?

为啥我的程序在 for 循环中返回 None?

为啥当我使用 [:] 时我的子类的 __getitem__ 和 __setitem__ 没有被调用?

为啥 __nss_database_lookup 在我的数字 C++ 程序中占用大部分时间

为啥 _CrtSetDumpClient 不起作用?

为啥 __inbyte 会使我的软件崩溃?