Iphone 什么';与[[UIApplication sharedApplication]委托]的交易是什么?
我正在使用[[UIApplication sharedApplication]delegate]跨多个类共享一个变量。我在AppDelegate中设置了值。我可以从myAppDelegate.m中记录它并查看其值。然后,当我的一个选项卡加载时,我尝试记录该值,但它崩溃了:Iphone 什么';与[[UIApplication sharedApplication]委托]的交易是什么?,iphone,variables,delegates,Iphone,Variables,Delegates,我正在使用[[UIApplication sharedApplication]delegate]跨多个类共享一个变量。我在AppDelegate中设置了值。我可以从myAppDelegate.m中记录它并查看其值。然后,当我的一个选项卡加载时,我尝试记录该值,但它崩溃了: myAppDelegate *app = (myAppDelegate *)[[UIApplication sharedApplication] delegate]; NSLog(@"Value:%@ ", app.deleg
myAppDelegate *app = (myAppDelegate *)[[UIApplication sharedApplication] delegate];
NSLog(@"Value:%@ ", app.delegateVar); // <--- Causes Crash
一种可能性是,
delegateVar
被过早释放
例如,可能delegateVar属性没有使用retain
选项设置,您正在显式调用[delegateVar release]
,或者您正在通过直接分配给setter来绕过setter(及其retain语义)(delegateVar=
而不是self.delegateVar=
)
在任何情况下,请查看创建、分配和释放delegateVar的代码
更新: 宾果。 这就是你的问题所在:
[delegateVar release];
delegateVar = [NSString stringWithFormat:@"Test Value"];
NSLog(@"%@",delegateVar);
您正在将一个自动释放的值(从+NSString stringWithFormat:)分配给delegateVar,并且没有采取任何措施来保留它。这意味着只要ApplicationIDFinishLaunching:
返回,delegateVar就会自动释放(并变得无效)
如果delegateVar是定义了“retain”选项的属性,则应按照以下方式执行此操作:
self.delegateVar = [NSString stringWithFormat:@"Test Value"];
您不需要在分配给delegateVar之前释放它(使用self.delegateVar=),因为setter将根据需要释放旧值。但是您确实需要在您的
dealoc
方法中释放它。David Gelhar可能已经找到了问题的原因,但是当您出现内存管理问题(EXC\u BAD\u ACCESS
是内存管理问题的迹象)时,您可以做很多事情:
delegateVar的
属性是什么?它是如何定义的?应用程序委托类的名称是什么?正常的命名约定是让AppDelegate.m
包含名为AppDelegate
的类,而不是myAppDelegate
。(类名按约定大写,因此“myAppDelegate*app=…
”看起来可疑。命名不一致只是我在这里发布时编辑时的一个错误。delegateVar是一个NSMutableArray。我在myAppDelegate.m中定义了它。请参阅我上面的编辑。“导致崩溃”如何?您到底得到了什么错误?啊,是的,ol'“过早释放“问题。早泄是一个严重的问题。我有一些朋友患有早泄,提高对这种情况的认识有助于其他早泄者面对他们的问题并找到解决办法。是的,看起来这是一个早泄问题。想想我女朋友从未抱怨过。。。
self.delegateVar = [NSString stringWithFormat:@"Test Value"];