“[UIApplication sharedApplication] delegate”是什么意思?

4

我正在使用[[UIApplication sharedApplication] delegate]来在多个类之间共享一个变量。我在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);

    ...
    }

delegateVar 属性是什么,它是如何定义的? - Shaggy Frog
你的应用程序委托类叫什么名字?通常的命名规则是将AppDelegate.m文件中的类命名为AppDelegate,而不是myAppDelegate。按照惯例,类名应该大写,所以"myAppDelegate *app = ..."看起来很可疑。 - David Gelhar
命名不一致只是我在发布这里时编辑错误。 - Chris
delegateVar是一个NSMutableArray。我在myAppDelegate.m中定义它...请看上面我的编辑。 - Chris
你确定 delegateVar 是一个 NSMutableArray 吗?在你的 applicationDidFinishLaunching 中它被设置为了一个字符串。 - Sam Dolan
显示剩余3条评论
2个回答

6
一种可能性是delegateVar被过早释放。
例如,delegateVar属性未使用retain选项设置,您明确地调用了[delegateVar release],或者通过直接赋值(delegateVar =而不是self.delegateVar =)绕过了setter(及其保留语义)。
无论如何,请查看创建、分配和释放delegateVar的代码。
更新:
中奖了。 这就是您的问题所在:
    [delegateVar release];
    delegateVar = [NSString stringWithFormat:@"Test Value"];
    NSLog(@"%@",delegateVar);

你正在将一个自动释放的值(来自+NSString stringWithFormat:)分配给delegateVar,并且没有做任何保留它的操作。这意味着一旦applicationDidFinishLaunching:返回,delegateVar就会自动释放(并变得无效)。
如果delegateVar是一个具有“retain”选项定义的属性,你应该这样做:
self.delegateVar = [NSString stringWithFormat:@"Test Value"];

使用 self.delegateVar = 给 delegateVar 赋值时不需要先释放旧值,因为 setter 方法会根据需要进行内存释放。但是在 dealloc 方法中,你需要释放 delegateVar。

2
啊,是的,老问题了,“过早释放”。 - barfoon
过早释放是一个严重的问题。我有朋友遭受过早释放的困扰,提高对这种情况的认识有助于其他过早释放者面对自己的问题并找到解决方法。 - dreamlax
是的,看起来这是一个过早发布的问题。想想我的女朋友从来没有抱怨过... - Chris

2

David Gelhar可能已经找到了问题的原因,但是当你遇到内存管理问题(EXC_BAD_ACCESS是内存管理问题的标志)时,有几件事情可以做:

  1. 重新阅读Cocoa 内存管理规则,确保你正在遵循它们。
  2. 运行静态分析器。这通常会发现你忽略了内存管理规则的地方。
  3. 尝试使用NSZombieEnabled查找是否向未分配的实例发送了消息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接