0

这里是我的代码:为什么我的应用程序崩溃使用__autoreleasing + __strong?

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

的问题是:这是怎么回事?

我需要详细了解此代码中正在进行的操作。真的很有趣... 仪器不显示任何泄漏,僵尸等

回答

2

initWithDomain:code:userInfo:是NSError的指定初始值设定项。这意味着不要拨打普通的init

你只说这得到同样的崩溃:

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

的问题无关,具有自动计数参考,自动释放,自动释放池,强,或任何其他的东西!这只是你正在做一个坏的NSError对象,然后尝试记录它。

+0

你能解释一下,那里有什么? – AndrewShmig 2013-05-03 17:34:41

+1

是的,我可以! :) NSLog崩溃了你。你正在创建一个无效的NSError对象。当你尝试记录它时,NSLog向​​你的NSError对象发送'description'消息。但它是无效的,所以它没有“描述”。 – matt 2013-05-03 18:47:12

+1

(好吧,它有一个'description'方法,但是该方法调用'localizedDescription',这就是问题的根源。) – matt 2013-05-03 18:57:21

相关问题