gpt4 book ai didi

iphone - [[UIApplication sharedApplication] delegate] 是怎么回事?

转载 作者:行者123 更新时间:2023-12-03 19:08:17 25 4
gpt4 key购买 nike

我正在使用 [[UIApplication sharedApplication] delegate] 在多个类之间共享变量。我在 AppDelegate 中设置了该值。我可以从 myAppDelegate.m NSLog 它并查看该值。然后,当我的一个选项卡加载时,我尝试 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 被过早释放。

例如,可能未使用 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方法中释放它。

关于iphone - [[UIApplication sharedApplication] delegate] 是怎么回事?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4161321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com