所以我有 2 个视图,每个视图中都有一个相同类型的对象。我在第一个视图中使用了一个块来设置对象,并且当我转到它时我将此块传递给第二个视图,以便可以在第二个视图中为对象运行完全相同的设置。(在某些情况下,它是一张地图,我在第一张地图上添加了标记和路径,然后我在第二个屏幕上继续使用地图的放大版本,该地图将具有相同的标记和路径)
现在有一个变量我只想存在于第一个视图中,但在第二个视图中仍然有效,它将是一个特殊标记,可以从第一个视图更改其位置(仅在后台更新 gps在第一个视图中),更改将出现在第二个视图中。
所以我实际上要做的是:
@implementation WhereAmIView
{
RMMarker *iAmHere;
void (^setupMap)(RMMapView*);
}
- (void) setup {
//__block RMMarker *_iAmHere = iAmHere;
setupMap = ^(RMMapView *mapViewBlock){
if(!iAmHere)
iAmHere = [[RMMarker alloc]initWithUIImage:[UIImage imageNamed:@"marker-red.png"] anchorPoint:CGPointMake(0.5, 1.0)];
//there is a bunch of other stuff i have omitted here, but the important bit is above this comment
[iAmHere setTextForegroundColor:[UIColor blueColor]];
[iAmHere changeLabelUsingText:@"You are Here"];
[markerManager addMarker:iAmHere AtLatLong:appDelegate.currentLocation.coordinate]; //dont worry about this stuff, just put it here to show that stuff is happening
}
setupMap(mapView);
}
- (IBAction)enlargeMap:(id)sender {
MainViewController *mainViewController = (MainViewController*)[self viewController];
FullScreenMapViewController *fsmvc = [[FullScreenMapViewController alloc] initWithCenter:CLLocationCoordinate2DMake(0, 0) andMap:@"tokai2.db"];
fsmvc->setupMap = setupMap; //this gets run in its viewDidAppear effectively
[mainViewController presentModalViewController:fsmvc animated:true];
}
所以我这样使用是否安全iAmHere
,因为这个块只会存在于这个视图和下一个视图中,所以技术上保留周期无关紧要?如果我使用在代码中而不是在块_iAmHere
中注释掉的那个,是否会在第一个视图中更改为,对第二个视图中的进行更改?可能根本不可能在两个地图视图中添加相同的标记,但理论上这可行吗?iAmHere
iAmHere
_iAmHere
或者也许有更好的方法可以完全做到这一点......