2016-11-17 52 views
0

我有一组映射注释,我正在迭代存储到我自己的数据模型中。我已经检查过日志,以确保坐标实际上不同,它们是。但是,当我尝试遍历相同的引脚数组并将坐标添加到我的模型中时,所有坐标都完全相同。NSMutableArray项目都完全一样

我知道,我的循环是罪魁祸首,但不能完全弄清楚为什么会发生的事情:

NSMutableArray *modelArray = [NSMutableArray new]; 
    for (PinObject *currentPin in self.mapPins) { 
     CLLocation *pinCoordinate = [[CLLocation alloc] initWithLatitude:currentPin.coordinate.latitude longitude:currentPin.coordinate.longitude]; 

     AnnotationCameraModel *cameraModel = [self.cameraModel initWithData:pinCoordinate]; 
     coordinates[i] = currentPin.coordinate; 
     [modelArray addObject:cameraModel]; 
    } 

for (AnnotationCameraModel *model in modelArray) { 
     NSLog(@"Coordinate: %@", model.coordinate); 
    } 

当我登录我的观点我结束了:

Coordinate: <+14.56841634,+121.03354250> +/- 0.00m (speed -1.00 mps/course -1.00) @ 11/17/16, 9:00:14 PM Philippine Standard Time 
Coordinate: <+14.56841634,+121.03354250> +/- 0.00m (speed -1.00 mps/course -1.00) @ 11/17/16, 9:00:14 PM Philippine Standard Time 
Coordinate: <+14.56841634,+121.03354250> +/- 0.00m (speed -1.00 mps/course -1.00) @ 11/17/16, 9:00:14 PM Philippine Standard Time 

任何想法?

+1

我打赌这些坐标记录在你的mapPins阵列*最后*坐标,对不对? @RokJarc和[和号] riyaz的回答对我来说都是正确的。简而言之,您一次又一次地向数组中添加相同的对象(cameraModel),每次通过不恰当地调用它的init方法来突出该对象。 – danh

回答

3

除非self.cameraModel(持此代码的对象的属性)是某种产生AnnotationCameraModel对象与方法工厂对象的initWithData:您的问题在于行:

AnnotationCameraModel *cameraModel = [self.cameraModel initWithData:pinCoordinate]; 

我怀疑这个属性只是一个简单的AnnotationCameraModel对象和它的初始值设定项(取决于它如何写入)返回自身。

更改该行:

AnnotationCameraModel *cameraModel = [[AnnotationCameraModel alloc] initWithData:pinCoordinate]; 

coordinates[i] = currentPin.coordinate;线也没有太大的意义。你可能想在coordinates[i++] = currentPin.coordinate;

+1

这就是它。我不正确地重写我的班级中的init方法。工作得很好。谢谢 :) –

3

线的东西应该有两部分的创作

1 - alloc 
2 - init 

你基本上是初始化一个已经初始化的对象。

在每一个init方法会有一个检查

if (self == nil) 
{ 
self = [super init]; 
} 
return self; 

所以基本上

[self.cameraModel initWithData:pinCoordinate] 

什么也不做,但返回self,因为它不是nil

做这个

AnnotationCameraModel *cameraModel = [[AnnotationCameraModel alloc]initWithData:pinCoordinate];