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; }
然后在代码中使用访问器而不是全局变量。
如果您的radioInputArray
为nil
,则可能会发生这种情况,您没有初始化该数组
你需要添加
[[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; }