我难住了。 NSLog 验证对象是它应该是啥,但是将对象添加到数组中不起作用

Posted

技术标签:

【中文标题】我难住了。 NSLog 验证对象是它应该是啥,但是将对象添加到数组中不起作用【英文标题】:I'm stumped. NSLog verifies the object is what it's supposed to be, but adding the object to array isn't working我难住了。 NSLog 验证对象是它应该是什么,但是将对象添加到数组中不起作用 【发布时间】:2014-10-17 20:28:21 【问题描述】:

jeoData 是一个单例...表格显示得很好,NSLog 验证选择了正确的行,但是,jeoData.crewList.count 在将对象添加到 NSMutableArray 后返回零...

在jeoData单例中,employeeList的初始化与crewList相同。

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

    Employee *employee = [jeoData.employeeList objectAtIndex:indexPath.row];
    [jeoData.crewList addObject:employee];

    NSLog(@"SelectCrewVC: added: %@ %@", employee.firstName, employee.lastName);
    NSLog(@"        total selected: %lu", (unsigned long)jeoData.crewList.count);    


NSLog: 
2014-10-17 15:09:41.590 SaveAndLoad[98371:414247] SelectCrewVC: added: Jacob Johnson
2014-10-17 15:09:41.591 SaveAndLoad[98371:414247]         total selected: 0

...即使 didDeselectRow 选择了正确的对象来显示,但我不知道为什么我不能将对象放入 crampList 数组中。

任何帮助将不胜感激,因为我很难过。

编辑:根据要求添加代码

JEOData.m(单例... init 发生的地方)

@implementation JEOData

@synthesize employeeList;
@synthesize leaseList;
@synthesize crewList;
@synthesize workReport;

+(id)sharedManager 
    static JEOData *sharedJEOData = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^ 
        sharedJEOData = [[self alloc] init];
    );
    return sharedJEOData;


-(id)init 
    if (self = [super init]) 
        employeeList = [[NSMutableArray alloc] init];
        leaseList = [[NSMutableArray alloc] init];
        crewList = [[NSMutableArray alloc] init];
        workReport = [[NSMutableArray alloc] init];
    
    return self;


@end

jeoData在View Controller头文件的@interface中声明

@interface SelectCrewViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> 
    JEOData *jeoData;
    NSMutableArray *crewList;  <---created only in troubleshooting, unused now

ViewDidLoad:

- (void)viewDidLoad 
[super viewDidLoad];

// Do any additional setup after loading the view.
jeoData = [JEOData sharedManager];

self.crewSelectTable.allowsMultipleSelection = YES;

NSLog(@"Num of employees total        :%lu", (unsigned long)jeoData.employeeList.count);
NSLog(@"       employees in crew list: %lu", (unsigned long)jeoData.crewList.count);

NSLog 返回:

2014-10-17 15:09:39.473 SaveAndLoad[98371:414247] Num of employees total        :3
2014-10-17 15:09:39.474 SaveAndLoad[98371:414247]        employees in crew list: 0

因此,您可以看到 jeoData.employeeList 包含正确的对象,jeoData.leaseList 也是如此。我知道因为 NSLog 而调用了 DidSelectRows,所以我知道 Employee 对象很好并且还活着,但它不会让我将这个小虫子添加到 crampList 可变数组中。

我很确定我只是在忽略某些东西,但我不知道它是什么。

请帮助我们,欧比旺·克诺比,你是我们唯一的希望。

【问题讨论】:

我假设您在某个时候初始化了 crampList? 通过单例沿wemployeeList初始化,employeeList同样方法返回数据。 您在哪里验证过jeoDatajeoData.crewList 都不是nil Jeodata 不为零,可以访问employeeList。在调用第一个 didselectrow 方法之前,crewList 应该为 nil。 打印NSLog语句中的crewList,你就知道了。 NSLog(@"crewList:%@", jeoData.crewList); 【参考方案1】:

解决了,好吧,我知道我忽略了一些东西......

jeoData 单例类的第一次初始化发生在初始视图控制器中,然而,由于没有实际添加到 crampList 可变数组中,一旦对有问题的视图控制器进行了 segue,crowList 数组就消失了,而不是被像employeeList 一样保留。

我在 viewDidLoad 的 jeoData.crewList 上调用了 init 函数,它允许我在数组中添加/删除。

我现在唯一需要弄清楚的是,在移动到另一个视图控制器之后,它是否仍会保留数组中的对象。

【讨论】:

以上是关于我难住了。 NSLog 验证对象是它应该是啥,但是将对象添加到数组中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

cookie 的返回类型是啥?

共享 RestAPI 令牌的模式是啥?

使用自动释放时,它实际上是啥时候释放的?

应该是啥组件?

Android 应用的 Firestore 安全设置应该是啥? [关闭]

验证给定格式的字符串