将NSMutableArray传递给archivedDataWithRootObject,返回nil

时间:2016-12-18 16:26:55

标签: ios objective-c

我有一个NSMutableArray,我从GPS存储CLLocation对象。问题是当我尝试将我的数组保存到NSData对象以便将其插入sqlite数据库时。 NSData对象具有nil值。直到几天前我的代码工作正常。我认为在xcode更新停止后。我的代码的片段如下:

@interface srTrackMeHome : UIViewController<CLLocationManagerDelegate>{
    CLLocationManager *locationManager;
    NSMutableArray *myLocations; 
}
单击按钮上的.m文件运行以下功能:

- (IBAction)StartTrackMe:(id)sender {  
        myLocations=[[NSMutableArray alloc]init];
        .
        .
        .
        .
        .
       [locationManager startUpdatingLocation];
}


-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{ 
.
.
.
.
[myLocations addObject:newLocation]; 

}

当我完成我的GPS点数收集后,我尝试以下(直到这一点,我可以看到我的数据有数据):

NSData *routePointsFromArray = [NSKeyedArchiver archivedDataWithRootObject:myLocations];` 

这里是routePointsFromArray = nil的地方,前几天这个有用。

我错过了什么吗?提前谢谢!

3 个答案:

答案 0 :(得分:0)

正如rmaddy指出的那样,看起来你永远不会初始化你的数组,所以你正在把你的位置对象放在地板上#34;。

您需要添加一行来创建数组:

NSMutableArray *myLocations = [NSMutableArray new];

//Now you can create locations 
[myLocations addObject:newLocation]; //newLocation comes from locationManager

在Objective-C中,您可以向nil对象发送消息,但它只是无声地失败,所以当您没有创建数组对象时,您的addObject调用才会被忽略。

答案 1 :(得分:0)

我设法解决了这个问题。即使我在xcode上看到nil值(我真的不知道为什么xcode显示nil值),上面的代码确实保存在数据库我的数组上。问题是我从数据库中检索数据。问题是xcode(我认为)运行“if {} else {}”代码的方式。当我检索数据时,我的代码应仅运行“if”部分但由于某种原因“else”代码也运行。我把我的功能分成了两个新功能。一个管理“if”代码和另一个“else”代码,一切正常。

我真的非常感谢你的时间和答案。

答案 2 :(得分:0)

据我所知,您在myLocations数组中添加了一个对象newLocation。

首先,newLocation是你的自定义模型类,对吧? 请确认,您是否在其上实现了NSCodingProtocol。

其次, 请检查方法didUpdateLocations,得到位置管理员的任何回复?

如果答案为否,请检查您的隐私权限位置是否添加了info.plist文件。