Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
NSMutableArray线程安全问题-iOS_Ios_Xcode_Thread Safety_Nsmutablearray - Fatal编程技术网

NSMutableArray线程安全问题-iOS

NSMutableArray线程安全问题-iOS,ios,xcode,thread-safety,nsmutablearray,Ios,Xcode,Thread Safety,Nsmutablearray,我有一个NSMutableArray,它在ASIHTTPRequest进程中使用。数据加载完成后,NSMutableArray存储信息。当我将数据添加为 [MyArray addObject]; [MyArray insertObject:[UIImage imageWithData:data] atIndex:buttonTag]; 我没有任何错误。但是,当我将数据作为 [MyArray addObject]; [MyArray insertObject:[UIImage imageWi

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

[MyArray addObject];
[MyArray insertObject:[UIImage imageWithData:data] atIndex:buttonTag];
我没有任何错误。但是,当我将数据作为

[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];

 }

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

希望下一个事实对您来说是显而易见的,但为了以防万一,我将指出
initWithCapacity:
不会向数组中添加任何元素。很多人都认为是这样,这就导致了你所描述的问题

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

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

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

像这样存储对象:

[myDictionary setObject:[UIImage imageWithData:data] forKey:[NSNumber numberWithInt:buttonTag]];
稍后按如下方式访问它:

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

当然,苹果的文档或快速搜索“NSDictionary示例”中提供了更多信息。

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

希望下一个事实对您来说是显而易见的,但为了以防万一,我将指出
initWithCapacity:
不会向数组中添加任何元素。很多人都认为是这样,这就导致了你所描述的问题

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

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

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

像这样存储对象:

[myDictionary setObject:[UIImage imageWithData:data] forKey:[NSNumber numberWithInt:buttonTag]];
稍后按如下方式访问它:

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

当然,苹果的文档或快速搜索“NSDictionary示例”可以获得更多信息。

您必须在数组范围内插入数组。您正试图插入到末尾

苹果文档:

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


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

苹果文档:

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


您确定这些插入发生在多个线程上吗?他们真的需要吗?您确定在插入每个图像时数组中始终至少有
buttonTag
条目数吗?您甚至有多个线程吗?(如果是这样,解决方案就是学习如何以线程安全的方式编码。)你好,Firoze,我正在根据服务器上可用的图像数量创建按钮。当我点击这些按钮时,我需要看到该按钮的相应图片。因此,我试图将图像存储到该按钮标记索引处的NSMutableArray中。我做错了吗?你分配了你的“MyArray”了吗?嘿@Siddharthan,有一件事你可能没有意识到,NSArray的数组中不能有零值。因此,例如,如果数组在索引0、1、2处有项,则不能在7、48或其他位置插入另一个元素。这就是你想做的吗?或者,您确定每次插入时至少有“buttonTag”项吗?您确定这些插入发生在多个线程上吗?他们真的需要吗?您确定在插入每个图像时数组中始终至少有
buttonTag
条目数吗?您甚至有多个线程吗?(如果是这样,解决方案就是学习如何以线程安全的方式编码。)你好,Firoze,我正在根据服务器上可用的图像数量创建按钮。当我点击这些按钮时,我需要看到该按钮的相应图片。因此,我试图将图像存储到该按钮标记索引处的NSMutableArray中。我做错了吗?你分配了你的“MyArray”了吗?嘿@Siddharthan,有一件事你可能没有意识到,NSArray的数组中不能有零值。因此,例如,如果数组在索引0、1、2处有项,则不能在7、48或其他位置插入另一个元素。这就是你想做的吗?或者,你确定每次插入时至少有“按钮标签”项目吗?非常感谢Husker。如果