Application Delegate中的Trashed属性

时间:2010-10-29 15:34:20

标签: iphone memory delegates properties

我陷入了困境。我的应用程序中的某些东西导致我的应用程序委托中的许多属性被删除(更改内容甚至对象类型,比如NSArray变成NSString ......),我无法调试它。我不会发现内存泄漏或错误。我发现的唯一一件事是ViewDidAppear一直是第一个标签的视图,一切都很好。视图显示一个表格。单击其中一个单元格时,应用程序委托属性已被删除。

在加载视图之后和didSelectCellForRow之前会导致什么?在这两个代码之间没有执行我的其他代码,当然在代理中没有代码。

任何以低俗的方式狩猎它的提示都会受到赞赏,或者只是想一些将它缩小到可能导致它的原因。

2 个答案:

答案 0 :(得分:0)

听起来有些东西过早地被释放,或者某些东西与你的一个XIB没有正确连接。如果您还没有,可能需要熟悉NSZombieEnabled,NSDeallocateZombies,NSEnableAutoreleasePool和NSAutoreleaseFreedObjectCheckEnabled。这些是可在可执行文件“获取信息”窗口的“参数”面板中设置的环境变量。

为了理智,我已将此添加到我的AppDelegate的-applicationDidFinishLaunching:

    #ifdef DEBUG
    //  account for environment value's actual value if set.
    NSString *NSZombieEnabled = (getenv("NSZombieEnabled")) 
                                    ? [NSString stringWithCString:getenv("NSZombieEnabled") encoding:NSASCIIStringEncoding] 
                                    : @"NO";
    DLog(@"NSZombieEnabled = %@", NSZombieEnabled );
    NSString *NSDeallocateZombies = (getenv("NSDeallocateZombies")) 
                                    ? [NSString stringWithCString:getenv("NSDeallocateZombies") encoding:NSASCIIStringEncoding] 
                                    : @"NO";
    DLog(@"NSDeallocateZombies = %@", NSDeallocateZombies );
    NSString *NSEnableAutoreleasePool = (getenv("NSEnableAutoreleasePool")) 
                                    ? [NSString stringWithCString:getenv("NSEnableAutoreleasePool") encoding:NSASCIIStringEncoding] 
                                    : @"YES";
    DLog(@"NSEnableAutoreleasePool = %@", NSEnableAutoreleasePool );
    NSString *NSAutoreleaseFreedObjectCheckEnabled = (getenv("NSAutoreleaseFreedObjectCheckEnabled")) 
                                    ? [NSString stringWithCString:getenv("NSAutoreleaseFreedObjectCheckEnabled") encoding:NSASCIIStringEncoding] 
                                    : @"NO";
    DLog(@"NSAutoreleaseFreedObjectCheckEnabled = %@", NSAutoreleaseFreedObjectCheckEnabled );
#endif

有时我不必通过Xcode UI检查这些变量。

答案 1 :(得分:0)

唯一的出路是浏览app委托和一些viewcontrollers中的每个alloc,并确保我知道使用NSCopying协议会发生什么。由于合成但有nil(然后重新分配!)对象有2个错误,1个拷贝错误,其​​中一个或多个导致了Objective-C早期“自动释放”时的垃圾。