问题描述
我对目标C还是陌生的。我想创建一个未知大小的2D数组,以便我可以访问它并添加值。我来自C ++背景,并查看教程要点和示例,例如似乎在C ++和Objective C之间创建2D数组有相似之处。
I am still new to objective C. I would like to create a 2D array of unknown size such that i can access it and add values. I come from a C++ background and looking at tutorial point and examples such as Declaring and Initializing 2D array of unknown size in C it seems there is a similarity in creation of a 2D array between C++ and Objective C.
我已经实现了以下示例,但出现错误:
I have implemented the following example and i get an error:
由于未捕获的异常'NSRangeException',正在终止应用程序,原因:'* -[ __NSArrayM objectAtIndex:]:空数组的索引0超出限制'**
Terminating app due to uncaught exception 'NSRangeException', reason: '* -[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array'**
我不确定是什么原因导致了该错误,对于解决此错误的帮助我将不胜感激
I am not sure what is causing the error, i would be grateful for assistance in solving this error and understanding it.
-(NSMutableArray *)categoryCk
{
if (!_categoryCk)
{
_categoryCk = [[NSMutableArray alloc] init];
}
return _categoryCk;
}
-(NSMutableArray *)subcategoryCv
{
if (!_subcategoryCv)
{
_subcategoryCv = [[NSMutableArray alloc] init];
}
return _subcategoryCv;
}
-(NSMutableArray *)subcategoryCk
{
if (!_subcategoryCk)
{
_subcategoryCk = [[NSMutableArray alloc] init];
}
return _subcategoryCk;
}
-(NSMutableArray *)outcomeCv
{
if (!_outcomeCv)
{
_outcomeCv = [[NSMutableArray alloc] init];
}
return _outcomeCv;
}
-(NSMutableArray *)outcomeCk
{
if (!_outcomeCk)
{
_outcomeCk = [[NSMutableArray alloc] init];
}
return _outcomeCk;
}
然后循环创建数组:
if([categories count]>0){
for (int i =0; i < categories.count; i++)
{
NSArray* subCategories= [categories[i] objectForKey: @"subCategories"];
NSDictionary *categoryItems = [categories objectAtIndex:i];
NSString *category = [categoryItems objectForKey:@"cv"];
NSLog(@"%@",category);
[self.categoryCv addObject:category];
NSString *categoryNum = [categoryItems objectForKey:@"ck"];
[self.categoryCk addObject:categoryNum];
if ([subCategories count] > 0){
for (int j = 0; j < subCategories.count; j++) {
if (self.subcategoryCv.count <= i) {
[self.subcategoryCv addObject:[[NSMutableArray alloc] init]];
}
if ([self.subcategoryCv[i] count] <= j) {
[self.subcategoryCv[i] addObject:[[NSMutableArray alloc] init]];
}
if (self.subcategoryCk.count <= i) {
[self.subcategoryCk addObject:[[NSMutableArray alloc] init]];
}
if ([self.subcategoryCk[i] count] <= j) {
[self.subcategoryCk[i] addObject:[[NSMutableArray alloc] init]];
}
NSDictionary *subcategoryItems = [subCategories objectAtIndex:j];
NSString *subCategoryCv = [subcategoryItems objectForKey:@"cv"];
[self.subcategoryCv[i][j] addObject:subCategoryCv];
NSString *subCatNum = [subcategoryItems objectForKey:@"ck"];
[self.subcategoryCk[i][j] addObject:subCatNum];
NSArray* outcome =[[subCategories objectAtIndex:j] objectForKey:@"outcomes"];
if ([outcome count] > 0) {
for (int k = 0; k < outcome.count; k++) {
if (self.outcomeCv.count <= j) {
[self.outcomeCv addObject:[[NSMutableArray alloc] init]];
}
if ([self.outcomeCv[j] count] <= k) {
[self.outcomeCv[j] addObject:[[NSMutableArray alloc] init]];
}
if (self.outcomeCk.count <= j) {
[self.outcomeCk addObject:[[NSMutableArray alloc] init]];
}
if ([self.outcomeCk[j] count] <= k) {
[self.outcomeCk[j] addObject:[[NSMutableArray alloc] init]];
}
NSDictionary *outComeItems = [outcome objectAtIndex:k];
NSString *outcomeCategoryCV = [outComeItems objectForKey:@"cv"];
//NSLog(@"%@",outcomeCatCV);
[self.outcomeCv[j][k] addObject:outcomeCategoryCV];
NSString *outCatNum = [outComeItems objectForKey:@"ck"];
[self.outcomeCk[j][k] addObject:outCatNum];
}
}else{
UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"Alert"
message:@"Error loading data from service : Empty Outcomes data"
preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault
handler:^(UIAlertAction * action) {}];
[alert addAction:defaultAction];
[self presentViewController:alert animated:YES completion:nil];
}
}
} else{
UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"Alert"
message:@"Error loading data from service : Empty Sub-Categories data"
preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault
handler:^(UIAlertAction * action) {}];
[alert addAction:defaultAction];
[self presentViewController:alert animated:YES completion:nil];
}
}
}else{
UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"Alert"
message:@"Error loading data from service : Empty Categories data"
preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault
handler:^(UIAlertAction * action) {}];
[alert addAction:defaultAction];
[self presentViewController:alert animated:YES completion:nil];
}
这就是我尝试访问数组的方式:
This is how i try to access the array :
cell.textLabel.text = [self.outcomeCv[categoryIndex][subcategoryIndex] objectAtIndex:indexPath.row] ;
推荐答案
调用 subcategoryCv [ i] [j]
,您必须确保
subcategoryCv.count>我&& subcategoryCv [i] .count> j
如果没有,您将遇到问题。
if not, you will got crash in you question.
到防止它,您需要在 subcategoryCv.count<时将一个新的
并在<$ c $时将新的 NSMutableArray
添加到 subcategoryCv
。 = i NSMutableArray
添加到 subcategoryCv [i]
c> subcategoryCv [i] .count< = j 。
To prevent it, you need to add a new NSMutableArray
to subcategoryCv
when subcategoryCv.count <= i
and add a new NSMutableArray
to subcategoryCv[i]
when subcategoryCv[i].count <= j
.
与另一个2D数组相同。例如,对于 subcategoryCv
It's same with another 2D array. For example with subcategoryCv
if (self.subcategoryCv.count <= i) {
[self.subcategoryCv addObject:[[NSMutableArray alloc] init]];
}
if ([self.subcategoryCv[i] count] <= j) {
[self.subcategoryCv[i] addObject:[[NSMutableArray alloc] init]];
}
NSDictionary *subcategoryItems = [subCategories objectAtIndex:j];
NSString *subCategoryCv = [subcategoryItems objectForKey:@"cv"];
[self.subcategoryCv[i][j] addObject:subCategoryCv];
NSString *subCatNum = [subcategoryItems objectForKey:@"ck"];
[self.subcategoryCk[i][j] addObject:subCatNum];
这篇关于目标C创建未知大小的2D数组并对其进行访问的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!