addObjectsFromArray:不复制到全局NSMutableArray

以下是相关代码的部分示例。

static NSMutableArray *radioInputArray; static NSMutableArray *buttonsArray; - (IBAction)lookForRadioButtons:(id)sender { // NSLog(@"Testing"); NSError *error; NSString *radiostr = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"getRadios" ofType:@"txt"] encoding:NSASCIIStringEncoding error: &error] ; if (radiostr == nil) { NSLog (@"Error! %@", error); } else { NSLog(@"%@",radiostr); NSString *radiotxt= [webView stringByEvaluatingJavaScriptFromString:radiostr]; NSLog(@"%@", radiotxt); NSArray *myRadios = [radiotxt componentsSeparatedByString:@"::"]; [radioInputArray addObjectsFromArray:myRadios]; NSLog(@"%d", myRadios.count); NSLog(@"Number of buttons in global radio array %d", radioInputArray.count); NSLog(@"%d", scrollViewer.subviews.count); } } 

因此它不会抛出任何exception并且似乎正常工作,除非在addObjectsFromArray:之后addObjectsFromArray: ,我在全局NSMutableArray中的计数为0(myRadios中的计数= 56)。 我很确定他们在这一点上应该是平等的,但事实并非如此。 我已经将我的NSMutableArray声明为接近顶部,以便可以全局访问它。 我错过了分配和初始化这个的东西吗? 它是不是像C#那样自动执行此操作? 再一次,这是我第一次从Windows编程进入Objective-C世界,所以请保持温和但随意批评。

您的两个全局数组未初始化。

线条

 static NSMutableArray *radioInputArray; static NSMutableArray *buttonsArray; 

只需将两个变量定义为NSMutableArray指针,因此您需要让它们指向NSMutableArray类的实际实例。

在初始化代码中的某个位置,或通过访问器(最好是类方法),您应该将变量设置为空的,新分配的NSMutableArray

这是一种方法:

 + (NSMutableArray*)radioInputArray { if (!radioInputArray) { radioInputArray = [[NSMutableArray alloc] init]; } return radioInputArray; } 

然后在代码中使用访问器而不是全局变量。

如果您的radioInputArraynil ,则可能会发生这种情况,您没有初始化该数组

你需要添加

 [[radioInputArray alloc] init]; 

在使用radioInputArray做任何事情radioInputArray

初始化对象的好地方是Global类中的“init”方法

防爆。

 -(id)init { if (self=[super init]) { self.globalAllArtworkArray=[[NSMutableArray alloc] init]; self.globalCollectionArray=[[NSMutableArray alloc] init]; self.globalLookbookArray=[[NSMutableArray alloc] init]; } return self; } +(ASNGlobalClass *)shareManager { static ASNGlobalClass *sharedInstance = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sharedInstance = [[self alloc] init]; }); return sharedInstance; }