我正在创建一个模型,然后将该模型添加到数组中。但是,一旦我添加了多个项目,我的模型中的某些属性最终会被复制。我具有类型为DrawnLayerModel的以下属性:
model.overlay
model.fillcolor
model.linecolor
model.overlayString
OverlayString是我目前最关注的属性。这是我创建模型对象并将其添加到我的数组的地方:
-(void)saveOverlay {
DrawnLayerModel *model = [self.drawnLayerModel initWithOverlay:self.mapView.overlays.lastObject fillColor:self.customFillColor lineColor:self.customLineColor overlayTitle:self.layerName];
[self.overlaysArray addObject:model];
for (DrawnLayerModel *model in self.overlaysArray) {
NSLog(@"Model ====> %@.", model);
NSLog(@"Title ====> %@.", model.overlayTitle);
}
}
每次按下此按钮,它都会添加一个新的模型对象:
- (IBAction)saveButtonPressed:(id)sender {
UITextField *textfield = alertController.textFields.firstObject;
self.layerName = textfield.text;
[self.helpers createSuccessAlertContoller:self mapView:self.mapView title:@"Layer Successfully Saved!" message:@"Choose the layers button in the navigation bar to access saved layers."];
[self saveOverlay];
}
我得到以下输出:
2018-02-05 13:47:12.387032-0800 prism[4910:1739598] Model ====> <DrawnLayerModel: 0x1c424d2c0>
2018-02-05 13:47:12.387166-0800 prism[4910:1739598] Title ====> Blue.
2018-02-05 13:47:12.387204-0800 prism[4910:1739598] Model ====> <DrawnLayerModel: 0x1c424d2c0>
2018-02-05 13:47:12.387235-0800 prism[4910:1739598] Title ====> Blue.
现在,如果您查看DrawnLayerModel输出,这些数字可疑相同:
0x1c424d2c0
这是保存对象的地址吗?为什么我的属性会重复?
答案 0 :(得分:2)
一旦我将多个模型添加到我的数组
问题在于执行该操作的代码:
DrawnLayerModel *model = [self.drawnLayerModel initWithOverlay:self.mapView.overlays.lastObject fillColor:self.customFillColor lineColor:self.customLineColor overlayTitle:self.layerName];
[self.overlaysArray addObject:model];
您只是一遍又一遍地重新初始化同一个持久对象(self.drawnLayerModel
)。因此,您要将相同的对象添加到数组两次(或更多)。将对象添加到数组不会复制它,并且对象指针只是一个引用,因此您可以将一个对象的多个引用添加到数组中。
这里的真正的问题是你已经打破了Objective-C中最基本的实例化法则:在没有说init
的情况下永远不要说alloc
非常相同的方括号。反之亦然:从不说alloc
而不说init
在同一行。