我使用[[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);
...
}
答案 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
是内存管理问题的标志),您可以执行以下操作:
NSZombieEnabled
来确定您是否向未分配的实例发送邮件。