对象的实例变量赋值给它时,它似乎不会被保留



当我将对象分配给实例变量时,我有某种保留问题。我的理解是,所有的局部实例变量都是strong,所以只要对象被实例变量引用,单独的赋值就足以确保对象不会被销毁,但事实并非如此。

在下面的代码中,我将实例MKRoute变量myRoute分配给来自计算方向调用的路由。此时myRoute存在并有效,具有台阶和折线等特征。但后来在我的代码中,我试图访问myRoute,我得到一个坏访问。

它似乎仍然有一个内存指针值,但对象的其余部分至少在调试器中消失了。没有折线或步骤等,或者至少不是它应该是什么。在我的代码中没有其他赋值或修改或myRoute。我需要做些什么来确保这个对象不会被破坏?

@implementation SomeClass
MKRoute *myRoute = nil; 
.
.
.
-(void) showRoute:(MKMapItem *)origin destination:(MKMapItem*)destination
{
    MKDirectionsRequest *request = [[MKDirectionsRequest alloc] init];
    request.source = origin;
    request.destination = destination;
    request.requestsAlternateRoutes = NO;
    MKDirections *directions = [[MKDirections alloc] initWithRequest:request];
    [directions calculateDirectionsWithCompletionHandler:^(MKDirectionsResponse *response, NSError *error) {
        if (error) {
            NSLog(@"ERROR %@",error);
            // Handle Error
        } else {
            [self drawRoute:response];
        }
    }];
}
-(void)drawRoute:(MKDirectionsResponse *)response
{
    for (MKRoute *route in response.routes)
    {
        myRoute = route;  // set the global route
        [mapView addOverlay:route.polyline level:MKOverlayLevelAboveRoads];
    }
}
.
.
.
@end

我很高兴地承认它是一个全局变量,而不是一个实例变量,但我仍然不明白为什么它失去了它的保留,如果我在变量声明中尝试STATIC或__strong,它仍然在drawwrite中分配,然后消失。

全局变量不是一种典型的或推荐的存储变量的方式,并且您没有提供关于访问该变量的代码以及当您崩溃时获得的堆栈(这对于准确诊断至关重要)的任何信息。

也就是说,您的问题可能是在一个队列上修改这个变量,而在另一个队列上访问它。calculateDirectionsWithCompletionHandler:在主线程上执行它的完成处理程序。从其他线程访问它时是否发生崩溃?更新指针值不保证是原子的,如果您同时读取和更新,则有可能接收到一个垃圾指针。

最新更新