1

我有一个在 ASIHTTPRequest 进程中使用的 NSMutableArray。数据加载完成后,NSMutableArray 存储信息。当我将数据添加为

[MyArray addObject];

我没有任何错误。但是,当我将数据插入为

[MyArray insertObject:[UIImage imageWithData:data] atIndex:buttonTag];

我有 malloc 错误或索引超出范围异常问题。我认为这是线程安全故障。有什么解决办法吗?

编辑:在 appdelegate.h

 @interface{
  NSMutableArray *imageArray;
 }

在 appdelegate.m

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
imageArray = [[NSMutableArray alloc] init];
return YES;
}

在 AsyncImageView.h

@interface{
  AppDelegate *delegate
}

AsyncImageView.m

- (void)connectionDidFinishLoading:(NSURLConnection*)theConnection {

  delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
  [delegate.imageArray insertObject:[UIImage imageWithData:data] atIndex:buttonTag];

 }
4

2 回答 2

1

没有看到你的代码很难说,但我怀疑这是一个线程问题。当你打电话时,insertObject:atIndex:你必须能够保证数组中至少有那么多对象。查看您的代码并查看添加对象的位置,并确保每个场景都会导致您添加足够的insertObject:atIndex不会失败的对象。

希望下一个事实对您来说是显而易见的,但为了以防万一,我会指出它不会initWithCapacity:向数组添加任何元素。许多人认为确实如此,从而导致了您描述的确切问题。

根据您的评论,解决方案可能是使用一堆 NSNull 对象预先填充您的数组,或者使用 NSDictionary 而不是数组。

编辑 这是一个快速的 NSDictionary 示例:

经过进一步审查,您实际上需要一个 NSMutableDictionary,因为您正在动态更新其内容。您不能使用整数作为键,因此您必须将整数“包装”在 NSNumber 对象中。(请注意,您可以使用任何对象作为键,而不仅仅是 NSNumbers。)

像这样存储一个对象:

[myDictionary setObject:[UIImage imageWithData:data] forKey:[NSNumber numberWithInt:buttonTag]];

以后像这样访问它:

myImage = [myDictionary objectForKey:[NSNumber numberWithInt:buttonTag]];

当然,更多信息可在 Apple 的文档中或通过快速搜索“NSDictionary 示例”获得。

于 2012-08-08T03:04:42.753 回答
0

您必须在数组边界内插入数组。您正试图插入末尾。

苹果文档:

如果一个数组包含两个对象,其大小为 2,因此您可以在索引 0、1 或 2 处添加对象。索引 3 是非法的且超出范围;如果您尝试在索引 3 处添加对象(当数组的大小为 2 时),NSMutableArray 会引发异常。

于 2012-08-08T03:29:28.053 回答