iPhone应用程序在离开并返回应用程序后崩溃

Posted

技术标签:

【中文标题】iPhone应用程序在离开并返回应用程序后崩溃【英文标题】:iPhone app crash after leaving and returning to app 【发布时间】:2013-10-22 17:12:41 【问题描述】:

我在使用定位服务的 iPhone 应用程序中发生了奇怪的崩溃。当我离开应用程序(通过按主页按钮)并立即返回(通过单击应用程序图标)时,它会得到一个 EXC_BAD_ACCESS,显然是因为一个对象已经变成了僵尸。

仪器显示违规对象的以下历史记录:

除了最后一个(崩溃)之外的所有调用者都来自框架代码(除了 main.m 之外没有黑色名称),所以我看不出错误来自哪里。我在 Instruments 中遗漏了什么吗?我觉得它有很多信息,但也许我看错了部分。

另外两个可能的提示:

    我认为这在 ios 5 之前不会发生

    控制台显示一条关于“仅添加到内存”的虚假消息,我无法识别/理解:

欢迎提出任何建议!

在引用 locn 的成员时发生崩溃,一个 ACLocation 对象:

@property(nonatomic,retain)ACLocation *locn;
        emailBody = [NSString stringWithFormat:
                        NSLocalizedString(@"%@\nLocation: %@, %@, %@",@"Email text header3"),
                        emailBody,
                        locn.ACLocality,
                        locn.ACAdministrativeArea,
                        locn.ACCountry
                     ];

ACLocation 定义为:

@interface ACLocation : NSObject <CLLocationManagerDelegate>  
    double ACLatitude;
    double ACLongitude;
    double ACAltitude;
    double ACAltitudeAccuracy;
    NSString *ACLocality;
    NSString *ACAdministrativeArea;
    NSString *ACCountry;
  
@property (nonatomic)double ACLatitude;  
@property (nonatomic)double ACLongitude;  
@property (nonatomic)double ACAltitude;  
@property (nonatomic)double ACAltitudeAccuracy;  
@property (nonatomic,retain)NSString *ACLocality;  
@property (nonatomic,retain)NSString *ACAdministrativeArea;  
@property (nonatomic,retain)NSString *ACCountry;
@end

【问题讨论】:

您引用的变量在移到后台时已被释放 当应用移至后台时,哪些变量会被释放? 【参考方案1】:

你有一个weak属性,而你应该有一个strong。查看您的属性并将其更改为强。

如果您使用实例变量(它们现在使用 xcode 自动合成),例如 someVariable,您可以使用 self.someVariable 访问它,因此它会被保留。如果不使用self.,您将绕过setter,并且不会在变量上设置retain

【讨论】:

感谢 Bot。该应用程序不使用 ARC,因此使用的属性实际上是保留而不是弱。不要认为我错过了保留,而且绝对不是它抱怨的实际变量。 它在抱怨什么变量?你能发布它抱怨的代码以及你在哪里实例化变量吗? @Andrew 看起来不像您正在使用 self.locn.blah 引用变量,还要确保在设置 locn 时您正在使用 self.locn = ... @Andrew 很高兴听到,我更新了我的答案以更好地解释它。 好吧,这是今天的愚蠢错误 - 希望它没有占用你太多时间@Bot

以上是关于iPhone应用程序在离开并返回应用程序后崩溃的主要内容,如果未能解决你的问题,请参考以下文章

FetchedResult 视图在离开视图并返回后不会更新

检查iphone中的网络可达性后应用程序崩溃?

Firebase 监听器在离开并返回屏幕后下载数据

iPhone应用程序更新后立即崩溃

iOS 8 / iPhone 6 XPC 崩溃

返回 App SpriteKit 后按播放