与[[UIApplication sharedApplication]委托]有什么关系?

时间:2010-11-12 03:14:49

标签: iphone variables delegates

我使用[[UIApplication sharedApplication]委托]来跨多个类共享变量。我在AppDelegate中设置了值。我能够从myAppDelegate.m NSLog它并看到值。然后我尝试在我的一个Tabs加载时NSLog值,并且它崩溃了:

myAppDelegate *app = (myAppDelegate *)[[UIApplication sharedApplication] delegate];
NSLog(@"Value:%@ ", app.delegateVar); // <--- Causes Crash

基本上似乎是在创建app.delegateVar的新实例?

delegateVar在myAppDelegate.h中定义,然后myAppDelegate.m我这样做:

  - (void)applicationDidFinishLaunching:(UIApplication *)application {

        ...

        [delegateVar release];
        delegateVar = [NSString stringWithFormat:@"Test Value"];
        NSLog(@"%@",delegateVar);

    ...
    }

2 个答案:

答案 0 :(得分:6)

一种可能性是delegateVar过早被释放。

例如,可能没有使用retain选项设置delegateVar属性,显式调用[delegateVar release],或者通过直接指定它来绕过setter(及其保留语义) (delegateVar =代替self.delegateVar =)。

在任何情况下,请查看创建,分配和释放delegateVar的代码。


更新

宾果。 这是你的问题:

    [delegateVar release];
    delegateVar = [NSString stringWithFormat:@"Test Value"];
    NSLog(@"%@",delegateVar);

您正在将自动释放的值(来自+ NSString stringWithFormat :)分配给delegateVar,并且没有做任何事情来保留它。这意味着只要applicationDidFinishLaunching:返回,delegateVar就会自动释放(并变为无效)。

如果delegateVar是一个定义了“retain”选项的属性,那么你应该这样做:

self.delegateVar = [NSString stringWithFormat:@"Test Value"];

在分配之前,您不需要释放delegateVar(使用self.delegateVar =),因为setter将根据需要释放旧值。但是需要在dealloc方法中发布它。

答案 1 :(得分:2)

David Gelhar可能已找到问题的原因,但是当您遇到内存管理问题时(EXC_BAD_ACCESS是内存管理问题的标志),您可以执行以下操作:

  1. 重新阅读Cocoa memory management rules并确保您关注它们。
  2. 运行static analyser。这通常会占用您忽略内存管理规则的地方。
  3. 尝试使用NSZombieEnabled来确定您是否向未分配的实例发送邮件。