Xcode:存储到“通知”中的对象的潜在泄漏

我有一个问题,使我的应用程序崩溃,我已经尝试了所有改变它,但没有运气。 所以我希望新的眼睛能帮助我一点点。

这里是我的代码的一个视图:

。H

@property (nonatomic, retain) UILocalNotification *notification; 

.M

 - (void)applicationDidEnterBackground:(UIApplication *)application { UILocalNotification *notification = [[UILocalNotification alloc] init]; notification.fireDate = [[NSDate date] dateByAddingTimeInterval:60*60*24]; notification.alertBody = @"Skal du ikke træne i dag? Det tager kun 7 minutter!"; [[UIApplication sharedApplication] scheduleLocalNotification:notification]; } 

分析时会出现以下错误:

  • 存储到“通知”中的对象的潜在泄漏

我真的希望你们中的一个能帮我一把。 谢谢!

类似于你的其他问题,改变:

UILocalNotification *notification = [[UILocalNotification alloc] init];

至:

self.notification = [[UILocalNotification alloc] init];

并使用self.notification而不是其他地方的notification 。 在使用Xcode的最新版本时,ARC将默认启用。 如果是这样,上面有关使用release的答案是不正确的。

注:编辑此答案使用属性点符号,而不是直接访问伊娃。 看到这样的答案多一点背景: 是self.iVar必要的强大的属性与ARC?

您需要 – -release或 – -release新的通知。 简单的做法是:

 - (void)applicationDidEnterBackground:(UIApplication *)application { UILocalNotification * notification = [[[UILocalNotification alloc] init] autorelease]; ^^^^^^^^^^^ notification.fireDate = [[NSDate date] dateByAddingTimeInterval:60*60*24]; notification.alertBody = @"Skal du ikke træne i dag? Det tager kun 7 minutter!"; [[UIApplication sharedApplication] scheduleLocalNotification:notification]; } 

系统严重依赖于命名约定。 初始化程序(例如-init ),复制程序(copy,mutableCopy)和+new是返回必须释放(或自动释放)的实例的方法示例。

还要注意的是, UILocalNotification * notification = ...声明了一个新的variables局部于你的方法体,这会影响你的notification属性。

您正在分配一个本地UILocalNotification但不释放它。 至less不在你发布的代码中。 分析器抓住了你,因为它没有看到资源被释放。 如果你在其他地方发布,那么分析器就不能抓住它。

为了解决这个问题,你应该把本地variables分配给你的属性,以确保属性的所有者(看起来像应用程序委托)保持对通知的生动引用。

 self.notification = notification; 

并在离开方法之前释放,以确保平衡您的保留计数。

 [notification release]; 

最后,一旦你使用通知,你可以把你的财产清空。 从应用程序代理释放它。 一旦你使用它,一定要这样做。

 self.notification = nil