NSMutableArray在另一个方法中无法返回值的问题排查
问题分析与解决方案:点击按钮时NSMutableArray返回null
嘿,这个问题我之前也踩过坑!核心原因就是变量作用域在搞事情,咱们一步步理清楚:
为什么会返回null?
你在setupSegmentButtons方法里定义的dtDate是个局部变量——它的生命周期只局限在这个方法内部。当setupSegmentButtons执行完毕,这个局部变量就会被系统的自动释放池回收销毁。等你点击按钮调用tapSegmentButtonAction:的时候,你再去访问dtDate,这个变量早就不存在了,所以自然会返回null。
而setupSegmentButtons里能正常打印,是因为那时候方法还在运行,dtDate还处于它的生命周期内,所以能正常访问。
解决办法:把dtDate变成实例变量或属性
要让dtDate在整个ViewController的生命周期内都能访问,你需要把它提升为实例变量或者属性,两种方式都可以,这里给你分别演示:
方式1:使用实例变量
在你的ViewController的.m文件里,找到类的扩展部分(如果没有就手动加一个),添加实例变量:
@interface YourViewController () { NSMutableArray *dtDate; // 这里声明实例变量 } @end
然后修改setupSegmentButtons里的初始化代码,去掉局部变量的声明,直接赋值:
// 去掉原来的 NSMutableArray *dtDate = [@[] mutableCopy]; dtDate = [@[] mutableCopy];
之后在tapSegmentButtonAction:里直接访问dtDate就可以了。
方式2:使用属性(更推荐,符合iOS开发的最佳实践)
同样在类的扩展里声明属性:
@interface YourViewController () @property (nonatomic, strong) NSMutableArray *dtDate; // 声明强引用属性 @end
然后在setupSegmentButtons里用属性初始化:
self.dtDate = [@[] mutableCopy];
添加元素的时候也要用属性:
[self.dtDate addObject:dateString];
最后在点击方法里访问属性:
-(void)tapSegmentButtonAction:(UIButton *)button { NSLog(@" Now can get array : %@", self.dtDate); NSString *txtDate = self.dtDate[0]; NSLog(@"txtDate=%@", txtDate); }
修改后的完整代码片段(以属性为例)
// 类扩展部分 @interface YourViewController () @property (nonatomic, strong) NSMutableArray *dtDate; @end @implementation YourViewController -(void)setupSegmentButtons { NSInteger numControllers = 7; NSDate *now = [NSDate date]; NSCalendar *calendar = [NSCalendar currentCalendar]; NSDate *beginningOfThisWeek; NSTimeInterval durationOfWeek; [calendar rangeOfUnit:NSWeekCalendarUnit startDate:&beginningOfThisWeek interval:&durationOfWeek forDate:now]; self.dtDate = [@[] mutableCopy]; NSDateComponents *comps = [calendar components:NSUIntegerMax fromDate:now]; NSDateFormatter *dateFormatter=[[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"dd/MM/YYYY"]; for (int i = 0; i<numControllers; i++) { UIButton *button = [[UIButton alloc]initWithFrame:CGRectMake(X_BUFFER+i*(self.view.frame.size.width-2*X_BUFFER)/numControllers-X_OFFSET, Y_BUFFER, (self.view.frame.size.width-2*X_BUFFER)/numControllers, HEIGHT)]; [navigationView addSubview:button]; NSString *dateString = [dateFormatter stringFromDate:[calendar dateFromComponents:comps]]; [self.dtDate addObject:dateString]; [button addTarget:self action:@selector(tapSegmentButtonAction:) forControlEvents:UIControlEventTouchUpInside]; ++comps.day; } NSLog(@" Can get my array : %@", self.dtDate); } -(void)tapSegmentButtonAction:(UIButton *)button { NSLog(@" Now can get array : %@", self.dtDate); NSString *txtDate = self.dtDate[0]; NSLog(@"txtDate=%@", txtDate); } @end
这样修改之后,点击按钮的时候就能正常访问dtDate数组啦!
内容的提问来源于stack exchange,提问作者Hanz Cheah
相关产品推荐
相关产品推荐

