NSMutableArray线程安全问题 - iOS

时间:2012-08-08 02:08:31

标签: ios xcode thread-safety nsmutablearray

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

[MyArray addObject];

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

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

我有malloc错误或索引超出范围的异常问题。我认为这是一个线程安全故障。对此有何解决方案?

EDITED: 在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];

 }

2 个答案:

答案 0 :(得分: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示例”中提供了更多信息。

答案 1 :(得分:0)

您必须在数组范围内插入数组。你试图插入到最后。

Apple Docs:

  

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