代码之家  ›  专栏  ›  技术社区  ›  shannoga

释放AppDelegate实例时应用程序崩溃

  •  1
  • shannoga  · 技术社区  · 16 年前

    我有一个将核心数据上下文传递给其中一个控制器的代码。 这几天工作得很好,直到调试器开始给我“非类型发布”错误,并使应用程序崩溃。 我已经检查了应用程序的漏洞,发现了来自SAPPDelegate对象的漏洞。所以我明白我必须释放它,但每次我做它都会崩溃。

    任何想法 谢谢 沙尼

    SAppDelegate *hbad= [[SAppDelegate alloc] init];
    NSManagedObjectContext *context = [hbad managedObjectContext];
    [hbad release];
    if (!context) {
        NSLog(@"problem with mannaged");
    }
    self.managedObjectContext = context;
    
    2 回复  |  直到 16 年前
        1
  •  1
  •   Elfred    16 年前

    如果sappdelegate是您的实际应用程序委托,那么这不是获得它的正确方法。您应该将代码更改为:

    SAppDelegate *hbad= [[UIApplication sharedApplication] delegate];
    NSManagedObjectContext *context = [hbad managedObjectContext];
    if (!context) {
        NSLog(@"problem with mannaged");
    }
    self.managedObjectContext = context;
    

    此外,泄漏不会导致崩溃,直到应用程序耗尽内存并被系统杀死。

        2
  •  1
  •   Community Mohan Dere    9 年前

    我不完全确定您为什么要创建新的SAPPDelegate。您应该只有其中一个,它会在启动时为您创建。为什么需要另一个SAPPDelegate实例?

    你应该看看 Elfred's answer 获取应用程序委托,而不是创建一个。


    但是,您发布的代码中有一个bug。…

    你需要保留上下文直到你完成它。要么:

    SAppDelegate *hbad= [[SAppDelegate alloc] init];
    NSManagedObjectContext *context = [[hbad managedObjectContext] retain];
    [hbad release];
    if (!context) {
        NSLog(@"problem with mannaged");
    }
    self.managedObjectContext = context;
    [context release];
    

    或稍后发布HBAD:

    SAppDelegate *hbad= [[SAppDelegate alloc] init];
    NSManagedObjectContext *context = [hbad managedObjectContext];
    if (!context) {
        NSLog(@"problem with mannaged");
    }
    self.managedObjectContext = context;
    [hbad release];