为啥我的应用程序使用 __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`?
为啥当我使用 [:] 时我的子类的 __getitem__ 和 __setitem__ 没有被调用?