You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:52:41