一个块中有意识的强引用,这是一个好主意吗?

时间:2013-04-04 09:08:04

标签: ios objective-c block

所以我有两个视图,每个视图都是相同的类型。我在第一个视图中使用了一个块来设置对象,当我转向它时,我将这个块传递给第二个视图,这样就可以在第二个视图中为该对象运行完全相同的设置。 (对于某些上下文,它是一个地图,我添加标记和路径到第一个地图,然后我在第二个屏幕上转换为具有相同标记和路径的地图的放大版本)

现在有一个变量我想只存在于第一个视图中,但仍然在第二个视图中有效,它将成为一个特殊的标记,可以从第一个视图改变其位置(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进行更改第二种观点?可能根本无法在两个地图视图中添加相同的标记,但理论上这会起作用吗?

或者有更好的方法可以完全做到这一点......

0 个答案:

没有答案