gpt4 book ai didi

objective-c - 基于 block 的枚举获取 BAD_ACCESS

转载 作者:行者123 更新时间:2023-12-04 04:48:36 25 4
gpt4 key购买 nike

我有一个基于块的枚举设置来遍历这样的 NSDictionaries 数组:

__block NSURL *contentURL;

//This method of enumerating over the array gives the bad_access error
[documents enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

NSString *aName = [(NSDictionary *)obj objectForKey:@"Name"];

if([aName isEqualToString:name]) {

contentURL = [NSURL URLWithString:[(NSDictionary *)obj objectForKey:@"Content"]];
*stop=YES;
}
}];

NSLog(@"Content URL for issue with name %@ is %@", name, contentURL);

如果我使用这种方法,我会在 contentURL 上收到 EXC_BAD_ACCESS 错误当我尝试在 NSLog 语句中打印出来时。

但是,如果我像这样枚举数组:
NSURL *contentURL;

//This method of enumerating over the array works fine
for (NSDictionary *obj in documents) {

NSString *aName = [obj objectForKey:@"Name"];

if([aName isEqualToString:name]) {

contentURL = [NSURL URLWithString:[obj objectForKey:@"Content"]];

}
}

NSLog(@"Content URL for issue with name %@ is %@", name, contentURL);

一切正常。这是为什么?

最佳答案

不久前我遇到了类似的问题。

事实证明,一些基于块的枚举方法将枚举包装在自动释放池中。由于您正在分配一个自动释放的对象,它会在 -enumerateObjectsUsingBlock: 之前被释放返回。

(我遇到了 -[NSDictionary enumerateKeysAndObjectsUsingBlock: 的问题,但同样的原则在这里适用)

试试这个:

contentURL = [[NSURL alloc] initWithString:[(NSDictionary *)obj objectForKey:@"Content"];

出于兴趣,您在使用 ARC 吗?如果你是,我希望它添加一个 -retain在任务中。

编辑:
您正在使用 ARC,所以这不是您问题的答案。分配给 __block 变量将保留该对象(除非您遇到 ARC 中的错误,这不太可能。使用 Apple LLVM 5.0 编译时,您提供的代码不存在此问题)。

您的问题很可能出在其他地方,而从使用便捷构造函数的更改只是掩盖了问题。

同样,在枚举期间设置的自动释放池可能会揭示由代码中其他地方引起的问题。它解释了为什么切换到使用快速枚举似乎可以解决问题,但和以前一样,它可能只是掩盖了代码中其他地方引起的问题。

我会在这里留下答案,因为有关自动释放池的信息可能仍然与偶然发现此问题的人相关。

关于objective-c - 基于 block 的枚举获取 BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17797334/

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