1

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

这是我的代码的视图:

。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];

}

分析时它给了我以下错误:

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

我真的希望你们中的一个可以帮助我。谢谢!

4

3 回答 3

0

您需要-release-autorelease新的通知。简洁的方法是:

- (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 = ...声明了一个新变量本地到您的方法主体,这会影响您的notification属性。

于 2013-07-03T21:45:57.300 回答
0

与您的其他问题类似,更改:

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

至:

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

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

注意:编辑此答案以使用属性点表示法,而不是直接访问 ivar。有关更多背景信息,请参阅此 SO 答案:对于具有 ARC 的强属性,self.iVar 是否必要?

于 2013-07-03T18:24:26.330 回答
-1

您正在分配一个本地UILocalNotification但不释放它。至少不在您发布的代码中。分析器抓住了你,因为它没有看到正在释放的资源。如果您在其他地方发布,则分析器不会以合法的方式捕获它。

要解决此问题,您应该将局部变量分配给您的属性,以确保属性的所有者(看起来像应用程序委托)保持对通知的实时引用。

self.notification = notification;

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

[notification release];

最后,一旦您完成使用通知,您就可以取消您的财产。从应用程序委托中释放它。完成使用后,请务必执行此操作。

self.notification = nil
于 2013-07-03T17:47:43.327 回答