gpt4 book ai didi

iPhone SDK 内存管理问题 - EXC_BAD_ACCESS

转载 作者:行者123 更新时间:2023-12-03 16:23:44 24 4
gpt4 key购买 nike

我长期以来一直在关注同样的问题,非常感谢任何帮助或建议。我确定它很简单,但我似乎找不到它。在我的应用程序委托(delegate)中,我使用以下代码加载了一堆附件对象(我创建的一个支持 NSCopying 的对象):

NSString     *path    = [[NSBundle mainBundle] pathForResource:@"Accessories" ofType:@"plist"];
NSDictionary *accDict = [[NSDictionary alloc] initWithContentsOfFile:path];

self.colors = (NSArray *) [accDict objectForKey:@"Colors"];
self.exteriorAccessories = [self loadAccessoriesForMode:EXTERIOR_MODE withDictionary:accDict];
self.interiorAccessories = [self loadAccessoriesForMode:INTERIOR_MODE withDictionary:accDict];
[accDict release];

这是它调用的方法的定义:
-(NSArray *)loadAccessoriesForMode:(NSString *)mode withDictionary:(NSDictionary *) dictionary
{
NSMutableArray *tempValues = [[NSMutableArray alloc] init];
for (NSDictionary *value in [dictionary objectForKey:mode])
{
Accessory *accessory = [[Accessory alloc] initWithDictionary:value];
[tempValues addObject:accessory];
[accessory release];
}

NSArray *returnArray = [[NSArray alloc] initWithArray:tempValues copyItems:YES];
[tempValues release];
[returnArray autorelease];

return returnArray;
}

当我获得 accDict 的发布时,我得到一个 EXC_BAD_ACCESS异常(exception)。如果我在循环内取出附件的释放,一切都很好 - 但我正在泄漏附件对象(这对我来说似乎很明显 - 如果我初始化它并分配它,我的工作就是释放它)。

当我在调试器中逐步执行此操作时,我看到 init、copy 和 dealloc 方法都按预期在我的 Accessory 对象上触发。如果您认为有帮助,我也可以发布 Accessory 对象的代码,但我认为问题出在此代码中。

最佳答案

我想我已经找到了原因,但我会在这里发布,以便其他人可以受益。它与我发布的代码没有任何关系。相反,问题出在 Accessory 对象内部。我是直接设置东西,而不是通过 self 调用 getter。

所以这:

value = [dict objectForKey:@"myKey"];

而不是这个:
self.value = [dict objectForKey:@"myKey"];

不知何故,这导致我对 NSDictionary 本身产生了不良的副作用(我认为这不是可变的,但似乎我在某种程度上把事情搞砸了)。我发现这一点的唯一方法是使用非常有用的建议 that I found on Cocoa With Love .

当我在 XCode 中使用 Print Description 选项时,我能够看到 NSDictionary 以某种方式包含 AccessoryValue 对象——我的自定义对象之一不应该存在,因为它只是从一个简单的 plist 加载的。通过将鼠标悬停在对象上以查看其详细信息(当进程在调试器中暂停时)并单击展开为对象详细信息的三角形旁边的小向上/向下箭头,可以在 XCode 中找到打印描述。对于字典,这会将它们的全部内容转储到控制台。

关于iPhone SDK 内存管理问题 - EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/770648/

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